7

与えられた

std::map<int,std::string> myMap;
fillMyMapWithStuff(myMap);

// modify key values - I need to add a constant value to each key
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi)
{
    // ...
}

再インデックスを適用する良い方法は何ですか? 古いエントリを削除し、新しいキーと古い値で新しいエントリを追加する必要がありますか?

4

5 に答える 5

8

新しいマップを作成して後で交換したほうがよいようです。削除と挿入nではなく、挿入操作のみが必要になります。nn

于 2010-10-07T18:23:35.853 に答える
5

はい、古いエントリを削除し、新しいキーで新しいエントリを追加する必要があります。キーは変更できません。

1 つまたはいくつかの要素のみを変更する場合map::insertは、新しい要素の位置をヒントにすることで効率的に行うことができます。新しいキーは必ず古いキーの後のどこかに配置されるため、古い要素を指すイテレータでヒントを与えることができます。ただし、新しく挿入されたキーを再評価しないように注意する必要があります (たとえば、端から端まで繰り返すことによって)。マップ全体を変更する場合は、新しいキーを作成する方が効率的です。

于 2010-10-07T18:21:15.697 に答える
3

はい、そうしなければなりません。マップ内にあるときのキーは const です。

于 2010-10-07T18:20:30.497 に答える
2

もう1つのオプションがあります。この操作がコレクションの重要な機能であり、パフォーマンスが重要な場合は、マップを完全にコピーすることを避けることができます。クラスのオーバーロードoperator[]、および他のアクセサーとミューテーターを作成し、キー値の現在のシフトを追加できます。

于 2010-10-07T18:34:44.557 に答える
2

新しいマップを作成する必要があると思います。ループ内で新しいキーを削除して追加すると、古いキーのセットを反復処理し、挿入したばかりのキーに触れないという整合性が失われる可能性があります。(キーがどのように配布されるかを知っていて、そこに独自のロジックを入れない限り。)

std::map<int,std::string> myMap;
fillMyMapWithStuff(myMap);

std::map<int,std::string> newMap;

// modify key values - I need to add a constant value to each key
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi)
{
    newMap[mi->first] = mi->second;
}
于 2010-10-07T18:26:38.320 に答える