我有一段操纵map<int,int>
对象的代码。让我们说在某些时候我想要将所有条目,键和值加倍。有没有办法在不创建新地图的情况下进行,循环并输入更新的条目?
我担心的是节省内存空间。
答案 0 :(得分:2)
可以将这两个值加倍:
std::map<int,int> my_map;
for(auto& item:my_map){
item.second*=2; // double all values
}
但是,由于Key
来自类型item
,因此无法将std::pair<const int,int>
加倍。请注意const
的{{1}}。
建议:
我认为Key
不是这种情况的最佳容器。试试这个:
std::map
修改强>
我担心的是节省内存空间。
如果只是内存问题,那么您可以从地图中选择一个项目,并在新地图中插入一个加倍版本,然后直接从旧地图中删除它。在这种情况下,您将松开地图的一个元素的大小而不是另一个地图的大小。
答案 1 :(得分:1)
您可以按正交键的键的相反顺序遍历地图,以避免副作用,并创建新的键/值对。您可以为负键执行等效操作。
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
int main() {
map<int, int> m = {
{10, 20},
{-5, 23},
{-10, 7},
{20, 30},
{15, 21},
{18, 2},
};
for (auto it = m.begin(); it != m.end() && it->first < 0; it = m.erase(it)) {
m[it->first * 2] = 2 * it->second;
}
for (auto it = m.rbegin(); it != m.rend() && it->first > 0; it++) {
m[it->first * 2] = 2 * it->second;
m.erase(----it.base());
}
for (auto &p: m) {
printf("%d, %d\n", p.first, p.second);
}
}
输出:
-20, 14
-10, 46
20, 40
30, 42
36, 4
40, 60