C++アプリケーションにmyMap
という_std::map
_があり、myMap.find(key)
または_myMap[key]
_のいずれかを使用して要素を取得したい。ただし、マップ内のその要素のインデックスも取得したいと思います。
_std::map<string, int> myMap;
// Populate myMap with a bunch of items...
myElement = myMap["myKey"];
// Now I need to get the index of myElement in myMap
_
それを行うクリーンな方法はありますか?
ありがとうございました。
std::map
には実際にはインデックスがありませんが、代わりにキー/値ペアのイテレータがあります。これは、コレクション内のソートの位置を表すという点でインデックスに似ていますが、数値ではありません。キー/値のペアの反復子を取得するには、find
メソッドを使用します
std::map<string, int>::iterator it = myMap.find("myKey");
私はこの答えを求めてここに来ましたが、この距離関数は2つのイテレータを取り、インデックスを返します
cout << distance(mymap.begin(),mymap.find("198765432"));
これが役立つことを願って:D
マップが既に修正されている場合(後でキーを追加/削除しない)、マップからインデックスを取得したい場合。次のことができます。
マップ全体のキーを格納する配列を作成します。そして、インデックスを使用してキーにアクセスできます!
_vector<int> keys;
for (pair<K,V> entry : yourMap) {
keys.Push_back(entry.first);
}
_
以上です。マップのインデックスi
にアクセスするには、_yourMap[keys[i]]
_を使用します
distance
関数に対するこのメソッドの利点は、時間の複雑さです。 O(1)
が保証されています。
さて、マップはキーとデータをペアとして保持しているので、マップのイテレータをペアに、またはペアの最初の要素に直接逆参照することでキーを抽出できます。
std::map<string, int> myMap;
std::map<string, int>::iterator it;
for(it=myMap.begin();it!=myMap.end();it++)
{
std::cout<<it->first<<std::endl;
}
マップのセマンティックには、インデックスは含まれません。それを理解するために、マップは通常ツリーとして実装されることに注意してください。したがって、その要素にはインデックスがありません(ツリーに対して自然な方法でインデックスを定義してみてください)。
マップは、内部的にツリー構造のデータであるキーと値のデータ構造です。上記のO(n)ソリューション。「distance(mymap.begin()、mymap.find( "198765432"))」では、正しい答えが得られません。要件については、 O log(n)の競合操作のために、独自のセグメントツリータイプのデータ構造を構築する必要があります。
マップにはインデックスのようなものはありません。マップは、「ペア」のシーケンスとして保存されません(少なくとも、必ずしも必要ではありません。実際、ほとんどの実装にはありません)。
ただし、実装に関係なく、std :: mapはインデックスを持つコンテナをモデル化しません。
この質問の対象に応じて、「インデックス」はイテレータ(他の人が提案したもの)またはキー自体になります。
しかし、あなたがこの質問をしたのは奇妙に聞こえます。詳細をお知らせいただければ、問題のより良い解決策をご案内できるでしょう。