web-dev-qa-db-ja.com

C ++マップの要素のインデックスを取得

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
_

それを行うクリーンな方法はありますか?

ありがとうございました。

21
SZH

std::mapには実際にはインデックスがありませんが、代わりにキー/値ペアのイテレータがあります。これは、コレクション内のソートの位置を表すという点でインデックスに似ていますが、数値ではありません。キー/値のペアの反復子を取得するには、findメソッドを使用します

std::map<string, int>::iterator it = myMap.find("myKey");
8
JaredPar

私はこの答えを求めてここに来ましたが、この距離関数は2つのイテレータを取り、インデックスを返します

cout << distance(mymap.begin(),mymap.find("198765432"));

これが役立つことを願って:D

52
Mahmoud Aladdin

マップが既に修正されている場合(後でキーを追加/削除しない)、マップからインデックスを取得したい場合。次のことができます。

マップ全体のキーを格納する配列を作成します。そして、インデックスを使用してキーにアクセスできます!

_vector<int> keys;
for (pair<K,V> entry : yourMap) {
    keys.Push_back(entry.first);
}
_

以上です。マップのインデックスiにアクセスするには、_yourMap[keys[i]]_を使用します

distance関数に対するこのメソッドの利点は、時間の複雑さです。 O(1)が保証されています。

3
off99555

さて、マップはキーとデータをペアとして保持しているので、マップのイテレータをペアに、またはペアの最初の要素に直接逆参照することでキーを抽出できます。

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;
}
1
user2614242

マップのセマンティックには、インデックスは含まれません。それを理解するために、マップは通常ツリーとして実装されることに注意してください。したがって、その要素にはインデックスがありません(ツリーに対して自然な方法でインデックスを定義してみてください)。

0
Sylvain Lobry

マップは、内部的にツリー構造のデータであるキーと値のデータ構造です。上記のO(n)ソリューション。「distance(mymap.begin()、mymap.find( "198765432"))」では、正しい答えが得られません。要件については、 O log(n)の競合操作のために、独自のセグメントツリータイプのデータ構造を構築する必要があります。

0
soul_departed

マップにはインデックスのようなものはありません。マップは、「ペア」のシーケンスとして保存されません(少なくとも、必ずしも必要ではありません。実際、ほとんどの実装にはありません)。

ただし、実装に関係なく、std :: mapはインデックスを持つコンテナをモデル化しません。

この質問の対象に応じて、「インデックス」はイテレータ(他の人が提案したもの)またはキー自体になります。

しかし、あなたがこの質問をしたのは奇妙に聞こえます。詳細をお知らせいただければ、問題のより良い解決策をご案内できるでしょう。

0
Stefano Falasca