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

你想要一个 ReverseMap 还是一个有序的地图?如果你想反转一个解决方案是

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

否则,您可以按阵列订购。

于 2013-03-27T17:00:37.060 回答
0

如果您的地图是一对一的(每个唯一键都有一个唯一值),只需像这样迭代:

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

在一般情况下,可能会构造一个从整数到整数列表的映射,并按如下方式构造它:

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

这假设您有一个 C++11 编译器。您可以将基于范围的 for 循环替换为 C++98/03 的常规 for 循环和迭代器。

于 2013-03-27T17:03:17.040 回答
0
  • 按排序顺序获取您的键列表:(sorted_keys大小n
  • 对于原始地图中的每个 ( key, value) 对:
    • 确定key'isorted_keys
    • 将键值对插入到新映射中: ( sorted_keys[n - i - 1], value)
于 2013-03-27T17:06:19.527 回答