反向映射值c ++

时间:2013-03-27 16:56:33

标签: c++ map reverse

我创建了一张地图:

map<int, int> mapOriginal;

填充数据之后,如下所示:

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

并且mapOriginal ouptut是:

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

我想创建另一张地图:

map<int, int> mapReverse;

但是如何将mapOriginal值反转为mapReverse:

并且mapReverse ouptut将是:

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

5 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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()返回一个迭代器到最后一个元素,并递增一个反向迭代器递减它的位置,将它移向容器的开头

答案 2 :(得分:0)

您想要ReverseMap还是有序地图? 如果你想要反向解决方案

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

否则你可以通过阵列订购。

答案 3 :(得分:0)

  • 按排序顺序获取密钥列表:sorted_keys(大小为n
  • 对于原始地图中的每个(keyvalue)对:
    • 确定key
    • i的位置sorted_keys
    • 在新地图中插入键值对:(sorted_keys[n - i - 1]value

答案 4 :(得分:-1)

如果您的地图是一对一的(每个唯一键具有唯一值),则只需迭代:

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

在一般情况下,可以构建一个从ints到int列表的映射,并按如下方式构造它:

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循环。