删除不再使用std :: map的内容

时间:2015-02-20 10:20:28

标签: c++ dictionary clear stdmap erase

我有一个std::map<int64_t, int64_t> foo; ..它每天都有XX对数量(未定义,可能是1或1000)。 为了减少内存使用量,我想删除地图中没有更多有用的元素。 我这样做了:

    map<int64_t, int64_t> tmpMap;
    // Copy into a new temporary map only elements to keep
    for (map<int64_t, int64_t>::iterator it = foo.begin(); it != foo.end(); ++it)
    {
        // the condition decides whether a pair is still useful or not
        if ([...]) 
        {
            pair<int64_t, int64_t>  tmpPair(it->first, it->second);
            tmpMap.insert(tmpPair);
        }
    }
    // Clear the main map
    foo.clear();
    // Copy tmpMap (which contains only useful elements) into the main map
    foo.insert(tmpMap.begin(), tmpMap.end());
    tmpMap.clear();

有关如何以更好的方式在资源使用方面实现目标的任何建议,考虑到foo可能有500/600对int64_t并且每次foo被调用时会调用这些行?

谢谢(对不起我的英文)

1 个答案:

答案 0 :(得分:3)

没有必要创建一个临时的;只需遍历std::map并有条件地调用std::map::erase。这是一个例子:

std::map<int,int> my_map {{1, 2}, {2, 3}, {3, 4}};
std::cout << my_map.size() << std::endl; // 3
auto begin = std::begin(my_map);
while (begin != std::end(my_map)) {
    if (begin->first == 2) {
        begin = my_map.erase(begin); // C++11
    } else {
        ++begin;
    }
}
std::cout << my_map.size() << std::endl; // 2