就地更新地图

时间:2016-01-19 11:39:44

标签: c++ dictionary

我有一段操纵map<int,int>对象的代码。让我们说在某些时候我想要将所有条目,键和值加倍。有没有办法在不创建新地图的情况下进行,循环并输入更新的条目?

我担心的是节省内存空间。

2 个答案:

答案 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