1

マップを作成しました:

map<int, int> mapOriginal;

その後、データを入力すると、次のようになります。

mapOriginal[0] = 3;
mapOriginal[1] = 2;
mapOriginal[2] = 1;

mapOriginal の出力は次のとおりです。

  0->  3
  1->  2
  2->  1

別のマップを作成したい:

map<int, int> mapReverse;

しかし、どうすれば mapOriginal の値を mapReverse に戻すことができますか:

mapReverse の出力は次のようになります。

  0-> 1
  1-> 2
  2-> 3
4

5 に答える 5

6

マップを前後に同時に反復処理できます。

std::map<int, int>::const_iterator forwardIt = mapOriginal.begin();
std::map<int, int>::const_reverse_iterator reverseIt = mapOriginal.rbegin();
for ( ;
    forwardIt != mapOriginal.end() ;
    ++forwardIt, ++reverseIt)
{
    mapReverse[forwardIt->first] = reverseIt->second;
}

しかし、それは地図の珍しい使い方のようです。ベクターがあなたのニーズを満たさないと確信していますか?

std::vector<int> vec { 3, 2, 1 };

std::vector<int> reverseVec;
std::reverse_copy(vec.begin(), vec.end(), std::back_inserter(reverseVec));
// or, if you want to reverse in-place:
std::reverse(vec.begin(), vec.end());
于 2013-03-27T17:15:04.720 に答える
1

STL は、コンテナー型のコンテンツをウォークスルーするためのイテレーターの概念を提供します。すべての STL コンテナーは反復子をサポートする必要があります。逆イテレータを使用するこのアプローチは、最も簡単なはずです

map<int, int> mapOriginal;

mapOriginal[0] = 3;
mapOriginal[1] = 2;
mapOriginal[2] = 1;

map<int, int>reverseMap;

auto reverseIT = mapOriginal.rbegin();

for(auto forwardIT = mapOriginal.begin(); forwardIT != mapOriginal.end(); forwardIT++, reverseIT++)
{
    reverseMap[forwardIT->first] = reverseIT->second;        
}

rbegin() はイテレータを最後の要素に返し、逆イテレータをインクリメントするとその位置がデクリメントされ、コンテナの先頭に向かって移動します。

于 2013-03-27T17:08:36.497 に答える
0
  • ソートされた順序でキーのリストを取得します: sorted_keys(サイズn)
  • 元のマップの 各 ( key, ) ペアについて:value
    • keyの位置を決定iしますsorted_keys
    • sorted_keys[n - i - 1]キーと値のペア ( , value)を新しいマップに挿入します。
于 2013-03-27T17:06:19.527 に答える
0

ReverseMap が必要ですか、それとも順序付きマップが必要ですか? 逆にしたい場合の解決策は

int size=3;
for(int i=0;i<2;i++)
mapReverse(i)=mapOriginal(size-i);

それ以外の場合は、配列で注文できます。

于 2013-03-27T17:00:37.060 に答える
0

マップが 1 対 1 (一意のキーごとに一意の値を持つ) の場合は、次のように繰り返します。

for (auto&& p : initial_map)
    reverse_map[p.second] = p.first;

一般的なケースでは、int から int のリストへのマップを作成し、次のように作成します。

std::map<int, std::list<int>> reverse_map;
for (auto&& p : initial_map)
    reverse_map[p.second].push_back(p.first);

これは、C++11 コンパイラがあることを前提としています。C++98/03 では、範囲ベースの for ループを通常の for ループと反復子に置き換えることができます。

于 2013-03-27T17:03:17.040 に答える