• ベストアンサー

std::mapの要素を別のキーに移動したいのですがどうしたら良いでし

std::mapの要素を別のキーに移動したいのですがどうしたら良いでしょうか。 例 map<int, list<string>> m; キー|値 1 |"aaa","bbb" 2 |"ccc" ↓ キー|値 2 |"ccc" 3 |"aaa","bbb" 検索して削除して挿入を考えましたがもっと効率の良い方法はあるのでしょうか?

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

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

「移動」というのが、どういう意図なのかによりますが(例題の 1 とか 3 とかがどうやって出てきたか) 単純に、1 から 3 に移動させるだけなら。 m[3] = m[1]; m.erase(1); でいけそうな気がします。 (未確認)

110110110110
質問者

お礼

回答ありがとうございます。 これが一番良さそうですね

その他の回答 (3)

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

まず余談から: めっちゃ大雑把にいえば std::map<K, V> と std::set<std::pair<const K, V> > は同じ なので, 「find でとってきた iterator の first」は邪悪な手段を使わない限り書き換えられません>#1. なぜかというと #3 で言われているように「std::map はイテレータで昇順スキャンするとキーの昇順に出てくることが保証されている」からです. 邪悪な手段でキーの値を書き換えるとこれが保証できなくなる. ついでにいえば, キーに oprator< () が定義されていなくても適切な比較関数を与えれば OK ですね>#3. もちろん「operator< () が定義されているクラスに対し別途比較関数を与えてキーとする」ことも可能. 本題については, たぶんそれくらいだと思います. splice を使ってもたいして変わらないような気がする.

110110110110
質問者

お礼

回答ありがとうございます。 補足ありがとうございます。

回答No.3

もしかしたらと思って補足。 std::map は、キーの昇順に並ぶことが保証されています。 ですから、 m[9] = ...; m[1] = ...; m[2] = ...; m[5] = ...; という操作の後でも、 m[1] -> m[2] -> m[5] -> m[9] の順に並びます。 (イテレータでたどってみればわかります) そういうわけで、キーの方は、大小関係(最低限、operator<() だったか?)が定義されてないと、実行時に失敗します。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

findで取得したイテレータのfirst(キー)を直接書き換えられませんか? #書き換えた結果マップに不整合が起こっても責任は持てませんが

110110110110
質問者

お礼

回答ありがとうございます

関連するQ&A

  • Mapの要素の削除と挿入

    こんにちは。 Listに挿入されたMapでKeyがFLGのValueが1のものを List要素ごと削除しFlgが0のものに新しくmap.put("LBL","○");したいのですがどうもうまくいきません。 getListMap()はTestListクラスにあるMapの挿入されたリストを返すメソッドです。 よろしくお願いします。 Mapの中身はこのようになっています。 [key=TYPE:value=AAA0] [key=NO:value=000] [key=FLG:value=1] [key=TYPE:value=AAA1] [key=NO:value=001] [key=FLG:value=0] [key=TYPE:value=AAA2] [key=NO:value=002] [key=FLG:value=1] [key=TYPE:value=AAA3] [key=NO:value=003] [key=FLG:value=1] [key=TYPE:value=AAA4] [key=NO:value=004] [key=FLG:value=1] [key=TYPE:value=AAA5] [key=NO:value=005] [key=FLG:value=0] [key=TYPE:value=AAA6] [key=NO:value=006] [key=FLG:value=1] [key=TYPE:value=AAA7] [key=NO:value=007] [key=FLG:value=0] [key=TYPE:value=AAA8] [key=NO:value=008] [key=FLG:value=1] [key=TYPE:value=AAA9] [key=NO:value=009] [key=FLG:value=1] public class Test { public static void main(String[] args) { TestList tl = new TestList(); List list = tl.getListMap(); for (int i = 0; i < list.size() ; i++){ Map map = (Map)list.get(i); Set keyset = map.keySet(); Iterator it = keyset.iterator(); System.out.println("-------------------"); while(it.hasNext()){ Object key = it.next(); if(map.get(key)=="1"){ list.remove(i); }else{ map.put("LBL","○"); } System.out.print("[key=" + key); System.out.println(":value=" + map.get(key)+"]"); } } } }

    • ベストアンサー
    • Java
  • STL mapからの要素の削除

    mapより特定の値を持つ要素を削除したいのですが、上手くいきません。 下のようなコードで実現しようとしたのですが、eraseを呼んだ次のループでもう一度eraseを呼んで実行時エラーとなってしまうようです。 erase後のイテレータが指す値が悪いのではないかとは思うのですが、実際に何が悪いのかご存知の方がいらっしゃればアドバイスをお願いいたします。 string s[20]; char c='a'; map<string,bool> m; //mapへの要素の挿入 for(int j=0;j<20;j++){ s[j]=string(&c); c++; if(j%10==0) m[s[j]]=true; else m[s[j]]=false; } map<string,bool>::iterator i; //削除処理 for(i=m.begin();i!=m.end();i++){ if(i->second){ m.erase(i); } }

  • STL MAPのキー

    3種類のキーを持ったデータの検索をしたいのですが、 mapで実現する場合、どんな方法があるのでしょうか キー int A、キー int B、キー string C、VOL=クラスX 検索はA,B,Cでそれぞれ行うとした場合、以下のようなmapのtypedefを3種類設定することになるのでしょうか? map<int, クラスX> aa; map<int, クラスX> bb; map<string, クラスX> cc; これですと削除がする場合には3箇所mapを修正するひつようがありますので1箇所で処理でしないのでしょうか?

  • STLのlistで重複するものだけを取り出す方法

    C++でVC++7.0を使用してプログラミングを学んでます。 ひとつハマっているのですが…、 STLのlistを利用して、重複するデータのみを一つにしたlistにしたいです。 例えば std::list<std::string> [1] bbb [2] aaa [3] bbb [4] ccc [5] eee [6] ddd [7] bbb [8] ccc と格納されたlistがあった場合に、 [1] bbb [2] ccc と2つ以上あるデータを1つのみ格納するようにしたいです。 重複するデータを省く処理なら思いつくのですが… (.sort()で重複するデータを並べ、.unique()で重複するデータを削除する) 上記のようなことは可能でしょうか? 何か有効な案がありましたら是非ご教授下さい!

  • std::stringの継承

    #include <iostream> #include <string> class test : public std::string{ }; int main() { test tmp; tmp = "aaa"; } tmp = "aaa";ですが test::operator =(char *) が定義されていないとでますが何故なんでしょうか? string(basic_string)でoperator=が定義されていると思うのですが、 演算子の定義は継承されないのでしょうか。

  • MAPに関して

    以下のように、マップにCLASS_Aのリストのリストを格納しています。 CLASS_A { private int a getter setter } MAP<String,List<List<CLASS_A>>> map = new HashMap<String,List<List<classA>>> キーを元に、マップからリストのリストを取得した場合に CLASS_Aからint aを取得する場合 for List<List<CLASS_A> a : DaoList(Daoの取得結果)) for List<CLASS_A> b : a) b.get() } } でよろしいでしょうか? (2重ループになってしまうので、もっと簡単な取得方法あったら教えてください)

  • MAPコンテナの宣言部分の表記に関して質問です

    C++でSTLのMAPを勉強しだしたのですが、 よく分からない部分を見つけました。 以下のようにmapを使う際に、 mapコンテナの宣言をするのは理解できたのですが、 map<string, int> mmbr ; // (string型,int型)の対データを管理 map<int, int> ikk ; //(int型,int型)の対データを管理 他人が作成したサンプルを見ていたら、 以下のようにmapのコンテナ宣言がされていました。 ********************************************************* typedef KEY key_type; typedef typename std::map<key_type, value_type> container_type; ********************************************************* 1行目でtypedefしているだけなので理解できるのですが、 2行目で行っているmapコンテナの宣言の意味が どうも意味が分からないでいます。 mapコンテナの宣言で、 <string, int>や<int, int>のようにせず、 <key_type, value_type>としているのは、 どういう意味なのでしょうか? どうぞ宜しくお願い致します。

  • C#での関数テーブルの作り方

    同じ質問で昔以下の回答がありましたが、今はライブラリが進歩しているようなので、より新しい構文を使った書き方がありましたら、是非ご教授いただければと思います。 delegate bool Execute( string oprand ); class Entry {  static bool aaa(string op)   { System.Console.WriteLine("aaa "+op); return true; }  static bool bbb(string op)   { System.Console.WriteLine("bbb "+op); return true; }  static bool ccc(string op)   { System.Console.WriteLine("ccc "+op); return true; }  static public void Main() {   System.Collections.Generic.Dictionary<string,Execute> map =    new System.Collections.Generic.Dictionary<string,Execute>();   map["AAA"] = aaa;   map["BBB"] = bbb;   map["CCC"] = ccc;   map["BBB"]("argument");  } } 宜しくお願い致します。

  • Listのマッチを判定する便利Util

    Javaで以下のような処理をスマートに実現する良い方法を教えて下さい。 ・Listに配列をaddして、そのListの配列に対して指定した値がいくつマッチするかを判定する。 具体例として、 1、配列を作成 String[] array1 = { "aaa", "bbb", "ccc" }; String[] array2 = { "bbb", "ccc", "ddd" }; String[] array3 = { "ccc", "ccc", "ddd" }; String[] array4 = { "fff", "ggg", "hhh" }; 2、Listに配列を格納 List list = new ArrayList(); list.add(array1); list.add(array2); list.add(array3); list.add(array4); 3、Listの要素から"ccc"と"ddd"が2つマッチする要素を取得 上記の場合は"ccc"と"ddd"が2つマッチするのはarray2だけなのでarray2を取得する。 ※array3も"ccc"と"ddd"が2つありますが、"ccc"が2つあるので計3つマッチと判定して取得しない。 質問は上記3、の箇所です。 できればfor文でループさせて突合せ処理みたいなことは避けてスマートに実現する方法を探しております。 どなたか良い方法をご存知でしたらご教示下さい、お願い致します。

    • ベストアンサー
    • Java
  • strcmp関数などでの複数の文字列の比較

    以下の例はランダムなiの値で文字列にアクセスして その文字列がどの文字列であるかを判定しているプログラムです。 char *string[] = {   "aaa",   "bbb",   "ccc", } ; int i = rand() % 3; if ( strcmp( string[ i ], "aaa" ) == 0 ) {   printf("aaaです"); } if ( strcmp( string[ i ], "bbb" ) == 0 ) {   printf("bbbです"); } if ( strcmp( string[ i ], "ccc" ) == 0 ) {   printf("cccです"); } するとこのようにif文の羅列になってしまいます。 (strstr関数を使う場合などでも同じような感じです。) 複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?

専門家に質問してみよう