• 締切済み

STLのmapを使ってコードを書き換える

問題文説明とコードは長いので、リンク先のページでまとめました。 http://codepad.org/M5yyvUud 問題文通りのプログラムをstd::setを使って書いてみたのですが、このコードをstd::setではなく、std::mapを使って書き換えるにはどのようにすればよろしいでしょうか? mapを使ってキーとコードを関連付けて、この単語にはこの数値が格納されていると調べれるようにしたいです。 setの時のように上手く組めず悩んでいます。 ご教授よろしくお願いいたします。

みんなの回答

回答No.2

よく見ると、例題が変。 最初の例題が、 こんにちわわZDいア漢お → いおこちにわんDZア漢 という並び替えになっているのに、 「AあえDCおうい」なら、「ACDあいうえお」になるのはどういう仕掛け? という気がしてしまいます。 しかも、「番号を振り分けて」の番号は、単に、コンテナの先頭から数えた番号ですよね、例題を見る限り。 で、本当に、この set 版と同じものを、map で作るのなら、 include <set> → include <map> set<string> → map<string, int> dic.insert(string) → map[string] = 1; s << *it → s << (*it).second と書き換えるだけで、同じ動きをする気はします(文字の並びは?ですが) でも、map を使って作るプログラムではない気がするので、多分、どこか違うのでしょう。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「うまく組めない」というのがどこで何に困っているのかわからんのだが.... 基本的には「今度は何番目」というのを覚えておいて, 単語 (?) を std::map に入れるごとに紐つけるだけでは?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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

  • 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でも結果は同じかと思います。

  • 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です。 原因が分かる方、ご回答をよろしくお願いします。

  • 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

  • hashCodeの使用について

    いつもお世話になっています。 hashCodeについて聞きたいのですが、 hashCodeは、暗号化にも利用されるらしいのですが、 使用理由がよくわかりません。 その場合、 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000045.htmlのURLによると、 HashMapクラスはキーからハッシュコードを取得し、ハッシュコードごとにグループ分けして値を格納する。 値を取得する時には、取り出すために渡されたキーからハッシュコードを取得し、そのハッシュコードを元にまず ハッシュコードごとのグループを取得し、 その後グループ内でキーを元に全検索を行う。 この方法によりHashMapクラスは値の検索がArrayListクラスよりも 早い。 また、ハッシュコードから元のデータは復元できないため、暗号化にも 使用される。 、 どういうことなのでしょうか? 上記の文を解釈して、ソースを作成しようとは思ったのですが、 よくわかりません。 作成してみたソースは、 HashMap hashMap = new HashMap(); //ハッシュコードで格納するmapデータ Map map = new HashMap(); map.put(0,"Tell"); map.put(1, "AAA"); map.put(2,"TTT"); //ハッシュコード String keyword = "keyword"; int key = keyword.hashCode(); //ハッシュコードでキーを設定 hashMap.put(key,map); //格納するMap Map maP = new HashMap(); for(int h=0;h<hashMap.size();h++) { //キーワードをハッシュコードに変換 int stK =keyword.hashCode(); //ハッシュコードで格納したMapデータの取り出し maP = (Map) hashMap.get(stK); } //Mapデータ表示 for(int i=0;i<maP.size();i++) { System.out.println(maP.get(i)); } つまり、ハッシュコードは文字が暗号化され、元の文字がわからない = 暗号化されたに等しくなる ということだけは何とかわかるような気はするのですが。。。 聞きたいのは、ハッシュコードをmapキーにした場合、 後でもし取り出したくなったりしたらどうすべきなのでしょうか? たとえば、どういった処理の場合に使用できるのでしょうか? また、hashCode()はしょっちゅう使用すべきではないのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • ファイル読み込みとmap処理

    Visual C++ 2008 Express Edition 環境です。 入力テキストファイルを読み込み、空白で単語を区切り、単語すべてをmapにいれるという処理のプログラムを書こうとしています。 perlでいうところのsplit, 配列へのpushをC++でstrtokとmapでならかけると思いました。 入力ファイルは input1.txt--------------- cat dog mice human mosquito beetle spider ------------------------- プログラムは #include <stdio.h> #include<iostream> #include <map> #include <vector> int main( ) { FILE *input_file1; input_file1 = fopen("input1.txt", "r"); char str[256]; char *token; std::vector<char *> my_vector; // while (fgets(str, 256, input_file1) != NULL) { token = strtok( str , " " ); while( token != NULL ){ my_vector.push_back(token) ; printf("%s\n",token); token = strtok( NULL , " " ); } } printf("starting vector loop\n"); std::vector<char *>::iterator it = my_vector.begin(); // while( it != my_vector.end() ) // { printf("%s\n",*it); ++it; // } fclose(input_file1); return 0; } というふうにしました。 cat dog mice human mosquito beetle spider というような出力がなされるものと思ったのですが、実行してみると mapを使ったループ(全要素)出力は mosquito uito le mosquito beetle spider というふうに出力されてしまいます。 strtokで単語を分ける部分は問題なく出力で確認できるので、問題はmapの作り方やポインタだと思うのですが原因がわかりません。 問題点、解決策がお分かりになる方、よろしくお願いします。

  • android CSVファイルのデータを

    初心者ですが宜しくお願いします。 やりたい処理えですが、CSVファイルのデータをHashMapにセットしたいのです。 現在は下記のように直接値をセットしています。 この値をCSVからセットするにはどうすればよいでしょうか? HashMap<String, String> map = new HashMap<String, String>(); // キーと値のペアを格納 map.put( "Key1", "あ1001" ); map.put( "key2", "い1002" ); map.put( "Key3", "う1003" ); map.put( "key4", "え1004" ); map.put( "key5", "err" ); ------------------------------------ value.csv "key2", "い1002" "Key3", "う1003" "key4", "え1004" "key5", "err" ------------------------------------ 上記csvファイルを作り、読み込むところまではわかります。 ヒント、参考サイトや参考書の情報でもかまいません。 どうぞよろしくおねがいいたします。

    • ベストアンサー
    • Java
  • C++STLについての質問です。

    C++STLについての質問です。 Visual C++ 2008 Express Edition を使用してDirectXアプリケーションを 作成しています。 その折、std::listテンプレートを使用する機会があったのですが、このリストを 使用しますと、 リンクしています... LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 fatal error LNK1120: 外部参照 3 が未解決です。 とのエラーが吐かれます。 ネットで検索すると、ソリューション構成をDebugからReleaseにすれば良いとの記述が ありましたので、実行してみました。しかし、 リンクしています... error LNK2001: 外部シンボル "_D3DXCreateTextureFromFileExW@56" は未解決です。 error LNK2001: 外部シンボル "_D3DXCreateSprite@8" は未解決です。 error LNK2001: 外部シンボル "_D3DXGetImageInfoFromFileW@8" は未解決です。 error LNK2001: 外部シンボル "_Direct3DCreate9@4" は未解決です。 fatal error LNK1120: 外部参照 4 が未解決です とのエラーが吐かれてしまいました。 尚、コード生成モードは、マルチスレッド(/MT)で作成しています。 どなたか、この問題を解決する方法をご存知ないでしょうか? よろしくお願いします。

  • Google Map APIのエラーについて

    6月20日以降にドメイン取得したサイトで、Google Mapの埋め込み表示が、添付画像のようなエラーになります。 調べてみて、 Google Map API キーが必要とありましたので、その手順でキーを取得しました。Google Mapを表示させるHTMLの<head>内の最下部に、Google Map API キーを以下のように書いてあります。 <script src="https://maps.googleapis.com/maps/api/js?key=(キー部)" type="text/javascript"></script> エラーの原因が、わかりません。 教えてください。 【関連情報】 ローカルPCでは、以下のソースできちんと表示されています。 <script type='text/javascript' src='http://maps.google.com/maps/api/js?sensor=false'></script> ・DOCTYPE 宣言文は、関係しますか? ・サイトはブロックされていません、 <meta name="ROBOTS" content="INDEX,FOLLOW">を記載。 ・1HTMLに2個の地図があります。複数のマーカーを立てています。 過去のサイトでは、エラーはありませんでした。 以上、エラ回避方法を教えてください!!!!!!

  • ホームページをあたらしいアドレスに移動中です。しかし、MAPが表示され

    ホームページをあたらしいアドレスに移動中です。しかし、MAPが表示されません。 「このウェブサイトには別の Google Maps API キーが必要です。新しいキーは http://code.google.com/apis/maps/ で作成できます。 」 のメッセージがでます。 1)APIキーを取得するときは、ホームページ名(xxx.co.jp)で取得し、ホームページのindex.htmに下記のコード(map.htm というページにもキーをセットしています)をセットしました。下記のように。 <script type="text/javascript" src="jquery.js"></script> <script src="http://maps.google.com/maps? file=api&amp;v=2&amp;key=ABQIAAAAiItYfhdk5yy9PUvtJ4epRTctn4dAblzLQuTlG4XTMkhLdCVvRRsNNsYECYpxO8S1qfPdex・・・・・・・" type="text/javascript"></script> <script type="text/javascript" src="common.js"></script> しかし、上記のえらーメッセージがでます。キーを取得するとき xxx.co.jp/index.htmを指定して取得もしましたが、えらーがでました。 2)現在レンタルサーバーの移動中(移動完了時期は、5/26期限)で、このホームページ(xxx.co.jp)では、MAPは表示をしております。  あたらしいIPアドレスで、ドメイン名はおなじですが、MAPを表示したいのです。旧のページはまだ存在します。新旧共存と言うことになります。IPアドレスを指定して(キーを指定して取得しても、同じ結果です。Google Mapsのみ、表示ができず、上記のえらーがでます。 インターネット上に、おなじドメイン名が存在するからでしょうか。たしかに、ドメイン名を指定すると、どっちのIPのHTMLが表示されているのか、わかりませんが。 以上よろしくお願いいたします。