我创建了一张地图:
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
答案 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
)key
,value
)对:
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循环。