• ベストアンサー

map(STL)でinsertを行いたいですが、成功できないでいます。

皆さん、こんにちは。 このほど、STLのMAPを勉強しだしたものですが、 もっと基本的な、 C++の事でつまずいてしまいました。 keyとvalueのセットを 登録したり、 取得したりするソースを書いています。 下記ソースにありますとおり、 getの指示を出した際は、 通常、find(key)を行い、 valueを得るのですが、 仮にfindにて意図するvalueが見つからなかった場合には、 MySQLから意図するkeyに対応するvalueを 取ってこようと思っています。 そして、MySQLからvalueを取得した後は、 「m1.insert」にて 取得したその「value」と「key」のセットを insertを行う事で、 コンテナに登録作業をしたいつもりなのです。 どんな1行を足せばいいでしょうか? ずばりの答えでなく、 ユルメな方針のアドバイスでも いただけるとありがたいです。 ================================================================= virtual void put(key_type key, value_type val) { m1.insert(std::make_pair(key, val)); } virtual void get(key_type key) { typename container_type::iterator iterator = m1.find(key); if (iterator != m1.end()) { CTL_INFO("", "[info] Got the value ."); } else { /* ここでMySQLへ接続を行う*/ char query[256]; std::stringstream keystream ; keystream << key; std::string key1 = keystream.str().c_str(); if(sprintf(query, "select value_dht from table_name where key = ('%s')",keystream.str().c_str())); mysql_query(conn, query); res = mysql_use_result(conn); //get the results while ((row = mysql_fetch_row(res)) != NULL){ std::stringstream keydb2stream ; key2stream << row[0] ; std::string val1 = key2stream.str().c_str(); } /* ここで、MySQLから得たvalについて、      上記「virtual void put」のように「m1.insert」を行いたい。 それにより、returnで再度virtual void getへ移動した際には、     「m1.find(key)」を成功させたいです。*/ } return 0; }; ================================================================= また、間違っているかもしれませんが、 試しに、 「return 0」の2行上で、 次の1行を入れてみたのですが、 コンパイル時にエラーが出て怒られて失敗をしてしまいました。 「virtual void put」の部分で行っているinsertと、 同じ内容の文字列を同じようにinsertしているのに、 今回は怒られてしまうのかも、 よく分かりませんでした。 的外れな対応でしたらすいません。 ======================================================== m1.insert(std::make_pair(keystream.str().c_str(), key2stream.str().c_str())) ======================================================== error: cannot convert ‘const char*’ to ‘sc::basic_message_cons<sc::basic_message<void, char> >*’ in initialization

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  要は std::pair(key_type, value_type) に渡して出来上がったペアの型と、std::map<key_type, value_type, compare, allocator>::insert() が求めるペアの型が合わないのではないでしょうか。    virtual void put(key_type key, value_type val) の場合に大丈夫な理由は恐らく、key_type と value_type に暗黙変換され、内部では std::make_pair(key_type, value_type) が形成されて、std::map<key_type, value_type, compare, allocator>::insert() が求めるペアの型と一致しているからだと思います。  兎に角、型を合わせないといけません。  後、  std::string val1 = key2stream.str().c_str();  ですが、  std::string val1 = key2stream.str();  で出来る筈です。

c_iamok
質問者

お礼

分かりました! 色々と参考になりました! ありがとうございました!

c_iamok
質問者

補足

machongolaさん アドバイスいただきありがとうございます! 色々と考える中、 確かに型の問題であることを、 自分でも実感が持ててきました! 書き漏れていたのですが、 前回までで記述済みの、 「virtual void put(key_type key, value_type val) 」の上の行に、 以下の内容があり、 テンプレートが適用されているのですが、 この場合、私が挿入した m1.insert(std::make_pair(keystream.str(), key2stream.str()))において、 どんな型に合わせるのが 適切なのでしょうか? それとも、記述の仕方が悪いのですかね? stringstreamのデータを char型にしたいと思って、 「str().c_str()」をつけたりしていました。 これで、エラーがでているということは char型に合わせようとしたのが間違いなのですかね? ================================================================= template<typename KEY, typename VALUE> class fruit : public s_t<fruit<KEY, VALUE>> { public: typedef KEY key_type; typedef VALUE value_type; typedef typename std::map<key_type, value_type> m1_type; } =================================================================

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

m1 の型が分かりませんが, エラーメッセージがすべてだと思います. sc::basic_message_cons<sc::basic_message<void, char> > が何かは知りませんが, なんとかしてそれへのポインタに変換しないとダメ. それ以前に「そこで自力で insert する」意味が分からん. put を呼び出せばいいだけじゃないの?

c_iamok
質問者

お礼

putに飛ばしたら、 やはり、型の事でコンパイル時に怒られ、 やはり、 型の問題である事を認識できました。 ということで、 後に解決できました。 ありがとうございました。

関連するQ&A

  • mapによるkeyとvalueのinsertに失敗しております。

    STLのmapコンテナにて、 valueを取得したり、 keyとvalueを登録するソースを書いていました。 get(key)にあたって、 valの取得に失敗した際には、 mapコンテナ上のkey-valueデータと 同期されているMySQLより、 データを取得してきます。 MySQLよりkeyに対応するvalの取得が 完了したら、 そのkeyとvalをmapコンテナに insertしたいと思っています。 つきまして、 insertを行おうと、 「_container.insert(std::make_pair(key, val));」の一文を ソースに挿入したところ、 「型が違う!」という内容(?)のエラー文で コンパイル時に怒られてしまいました。 ただ、「どの様に直してごらん!」と エラー文が言っているのか、 今いち、意味を理解できないでいます。 このエラー情報的には、 どんな風の型の改善を求められているのでしょうか? 教えていただけるとありがたいです。 もし可能でしたら、pointBの 「_container.insert(std::make_pair(key, val));」の部分で、 MySQLから取得済みkeyとvalを、 pointAのkeyとvalに代入する方法も 教えていただけるとありがたいです。 どちらかでも、 アドバイスをいただけますとありがたいです。 どうぞ宜しくお願い致します。 -------------------------------------------------- template<typename KEY, typename VALUE> class hoge : public service_object<ipl<KEY, VALUE>> { virtual void put(key_type key, value_type val) { _container.insert(std::make_pair(key, val)); // pointA } virtual cc::fu<value_type> get(key_type key) { typename container_type::iterator iterator = _container.find(key); if (iterator != _container.end()) { return cc::fu<value_type>((*iterator).second); }else { //getにした場合MySQLよりkeyとvalueを取得完了できるので取得した。 /* MySQLより取得したkeyとvalをpointAのようにmapコンテナにinsertしたい。*/ _container.insert(std::make_pair(key, val)); //pointB  } } }; -------------------------------------------------- ■エラー文 error: conversion from std::pair<std::_Rb_tree_iterator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_ptr<csx::basic_message_cons<csx::basic_message<void, char> > > > >, bool>’ to non-scalar type ‘csrpc::future<boost::shared_ptr<csx::basic_message_cons<csx::basic_message<void, char> > > >’ requested

  • C++のSTL mapを使用するとセグメンテーション違反となる

    こんにちは。C++でSTLのmapの簡単な使用テストを以下のプログラムで行っており、動作確認ができました。 /* Assoc_array.c */ #define MAIN // (#include省略) using namespace std; namespace Usefuls { class Assoc_array_str { private: map<string, string> _h; public: void set(string key, string val); string get(string key); }; void Assoc_array_str::set(string key, string val){ _h.insert(pair<string, string>(key, val)); } string Assoc_array_str::get(string key){ map<string, string>::iterator p; p = _h.find(key); return p->second; } } #ifdef MAIN int main(){ Usefuls::Assoc_array_str assoc; assoc.set("Konnichiwa", "Hello"); cout << assoc.get("Konnichiwa") << endl; return 0; } #endif /* ここまで */ しかし、これを以下のように他のファイルから呼び出すと(先頭の#define MAINを#undef MAINに変えます)、「セグメンテーション違反です」というメッセージが出てしまいます。 /* Aa_test1.c */ #include <iostream> using namespace std; namespace Usefuls { class Assoc_array_str { public: void set(string, string); string get(string); }; } int main(){ Usefuls::Assoc_array_str assoc; assoc.set("Konnichiwa", "Hello"); cout << assoc.get("Konnichiwa") << endl; return 0; } /* ここまで */ コンパイル方法は以下の通りです。 g++ -c Assoc_array.c g++ Aa_test1.c Assoc_array.o また、使用プラットホームはLinuxのCentOS 4.3です。 原因が分かる方、ご回答をよろしくお願いします。

  • STLのmapのキーの変更方法

    // この時点でキーは"1,2,3,4,5"と並んでいる std::map< CString , int >::iterator it = m_mapNOKATA.find("3"); if( it != m_mapNOKATA ) { (*it).first = "9"; } というような使い方は出来るのでしょうか? また、これをした場合、 for( it = m_mapNOKATA.begin() ; it != m_mapNOKATA.end() ; ++it) { cout << (*it).first << endl; } とすると、結果は 1 2 4 5 9 となるのか、 1 2 9 4 5 となるのでしょうか? 上の結果が正しいように思えますが、だとしたら、キーを変更した時点で並べ替えが起きている? それとも、キーはinsert後はもう変更できなくて、erase→insertとしなくてはならないのでしょうか? 手元にSTL環境が無いので、確認できません。 どなたかお分かりの方がいらっしゃいましたら教えてください。 たぶん、multimapやsetでも結果は同じかと思います。

  • テンプレートクラスとSTLを利用したMyListクラス

    こんにちは。STLのリストを使い自分だけのMyListクラスを作ろうとしたのですが、コンパイルできません。 エラーメッセージは警告 std::list<T>::iterator' : 依存名は型ではありません。 とでます。 ご教授お願いします。 #include<list> #include<iterator> template <class T> class CMyList { public: CMyList(); //virtual ~CMyList(); //bool HasNext(); //T Next(); //void Pushback( T t ); //void EraseCheck(); //T GetFirst(); private: std::list< T > m_List; std::list< T >::iterator m_It;//コンパイルエラー }; template <class T> CMyList<T>::CMyList() { m_List.clear(); std::list< T > ::iterator it = m_List.begin();//こう宣言する分にはOK m_It = m_List.begin(); } int main() { CMyList<int> m_List; return 0; }

  • insertがうまくいかない

    PHP5+MYSQLの環境で $sql_str = "INSERT INTO bbs(userid,toukouid,groupid,title,memo) VALUES('$name','$toukouid','$group','$title','$memo')"; mysql_query($sql_str, $con_id); を実行しますが、登録ができません。 mysql_queryの結果がfalseです・・・。 ちなみに変数は全て1が代入しています。 悪いところあれば指摘お願いいたします。 また、他の情報が必要であればもうしつけください。

    • 締切済み
    • PHP
  • C++ の map についてです

    C++の初心者です。よろしくお願いします。 DirectXを使っていて簡単なゲームを作っていまして、 mapを使っていると、このようなエラーが出てしまいどうしても理由わかりませんでした。 class D2DMap : public GameTexture{ protected: GameTexture** CopyTexture; int MaxMass; int WidthMass; int HeightMass; int WidthMassPixel; int HeightMassPixel; int MassInfo[30][30]; public: D2DMap(); virtual ~D2DMap(); HRESULT LoadMapTexture(int widthmass, int widthmasspixel,int heightmass, int heightmasspixel, const char* FileName, D3DCOLOR color); HRESULT LoadTextMass(const char* FileName); int GetWidthMassPixel(){ return WidthMassPixel;} int GetWidthMassNum(){ return WidthMass;} int GetHeightMassPixel(){ return HeightMassPixel;} int GetHeightMassNum(){ return HeightMass;} int GetMassInfo(int x, int y){ return MassInfo[y][x];} void DrawMap(D3DCOLOR color); void DrawCopyMap(D3DCOLOR color); void SetCopyTex(GameTexture* copy){ CopyTexture= &copy;} void Delete(){} }; map<string , D2DMap*> MapBox; と定義して string Name="--------"; D2DMap map; MapBox.insert( map<string, D2DMap*>::value_type(Name, &map)); としたとこと error C2275: 'std::string' : この型は演算子として使用できません 'std::string' の宣言を確認してください。 error C2059: 構文エラー : '>' error C2039: 'value_type' : '`global namespace'' のメンバではありません というエラーが出てきました。 mapのfind や iterator は可能なのですがinsertの場合エラー となり、理由が全く分かりません。詳しい方アドバイスをお願いしたい のですが、よろしくお願いします。 VC++2008 を使っています。

  • php mysql INSERT

    mysqlのデータ登録の際に値が空だとエラー文が表示されてしまいます。 エラー文は You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 にでます。 なお、mysqlのバージョンは5.1です。 試行錯誤で試したのですが、なかなかできないためわかる方がいましたら宜しくお願いします。 ソースは foreach((array) $test1 as $key => $val){ if($val !== "" && $test2[$key] !== "") { $vals .= ","; $vals .= "('$val','$test2[$key]')"; } } if($vals !== "") { $vals = trim($vals,','); $testQuery = sprintf("INSERT INTO `home_scorer` (`test1`,`test2`) VALUES" .$vals); $testResult = mysql_query($testQuery, $link) or die(mysql_error()); } test1 と test2に値が入っていれば登録はさせるのですが、値が入っていないときはINSERTしない状態にできればと思います。 宜しくお願いします。

    • 締切済み
    • PHP
  • チェックボックスで選択したものがINSERTできません。

    <input type="checkbox" name="color[]" value="1" checked>赤 <input type="checkbox" name="color[]" value="2" >青 <input type="checkbox" name="color[]" value="3" >黄 <input type="checkbox" name="color[]" value="4" >緑 をPOSTで送ってPHPで $color_arr=Array(1=>"赤",2=>"青",3=>"黄",4=>"緑"); $color=$_POST["color"]; $str_color=""; foreach ($color as $key => $value){ if($str_color!="") $str_color.=","; $str_color.=$color_arr[$value]; } $html = str_replace('_%color%_', $str_color, $html); として追加内容確認画面で <input type="hidden" name="color" value="_%color%_"> _%color%_ として、チェックしたものを 赤,黄のように表示させて「OK」ボタンを押して PHPでINSERTするんですが、 mysql_query('insert into table1(name,color) values("'.$_POST['name'].'","'.$_POST['color'].'")'); としても空白のままです。nameはちゃんと入ってます。 テーブルは name varchar(50) color char(1) です。

    • ベストアンサー
    • PHP
  • ostringstreamではまりました

    const char*を受け付ける関数に、文字列を組み立てて渡すために、 以下のようにしました。 しかし、結果何も出力されません。 どこがまずいのでしょうか? std::ostringstream str_stream; str_stream << "aiueo" << 33; const char* c_str = str_stream.str().c_str(); std::cout << c_str << std::endl;

  • [C++]std:mapの扱いを教えて頂けますか?

    お忙し中、失礼します。 プログラミングのついて質問させて下さい。 使用言語: C++ 使用ヘッダファイル:<map> [質問] 動的確保したstd:mapを解放したいのですが、 mapの第二引数にクラスポインタを与えた場合、 登録したクラスのメンバ関数を呼び出すことは 出来るでしょうか? もし可能ならば、方法を教えて頂けないでしょうか?? 自作クラス class C; class test { //メンバ変数  private: C m_pC; //メンバ関数 public: test();     //コンストラクタ ~test();    //デストラクタ //初期化処理 void Init() { m_pC = new C(); } //終了処理   void Term() { delete m_pC; m_pC = NULL; }} }; map 定義 map< ID , test* >* pMap; マップ解放処理 std::map< ID ,test*>::iterator iterator; iterator = pMap->begin(); for(iterator ; iterator != pMap.End();iterator++) { //************************ // // ここでtestクラスの解放処理を呼び出したい // 例) test->Term() // //************************* } //マップ登録要素クリア pMap->clear(); まだ、mapの仕様が分かっておらず勉強中の身で 申し訳ないです。 助言頂ければ幸いです。 どうかよろしくお願いします。

専門家に質問してみよう