Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除std::map中不再使用的内容_C++_Dictionary_Stdmap_Erase - Fatal编程技术网

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

C++ 删除std::map中不再使用的内容,c++,dictionary,stdmap,erase,C++,Dictionary,Stdmap,Erase,我有一个std::map 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 != fo

我有一个std::map 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时都会调用这些行,有没有关于如何在资源使用方面更好地实现我的目标的建议


感谢并为我的英语感到抱歉

没有必要创建临时文档;只需迭代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

不需要创建临时的;只需迭代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

不需要创建临时的;只需迭代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

不需要创建临时的;只需迭代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

不只是使用该方法有什么原因吗?可以使用erase,但必须小心,因为删除迭代器会使迭代器无效。另外,您还需要担心并发性吗?此外,除非您是在嵌入式设备上运行代码,否则600对就不算什么了。显然,如果数据量很大,这个解决方案就没有效率。我对std::map不太熟悉,我发现这种方法更简单。特别是,我不确定一旦你删除了第一个XXX元素,地图的按键会发生什么。所以我认为这种方式可以让我的地图更清晰。但我在这里是想提出一些建议:@andreiterators invalization正是我使用tmpMap的原因。因为,如上所述,我不太熟悉地图,处理迭代器无效是我大脑不太了解的事情。这个问题可能会有帮助。您不只是使用该方法有什么原因吗?您可以使用erase,但必须小心,因为删除迭代器会使其无效。另外,您还需要担心并发性吗?此外,除非您是在嵌入式设备上运行代码,否则600对就不算什么了。显然,如果数据量很大,这个解决方案就没有效率。我对std::map不太熟悉,我发现这种方法更简单。特别是,我不确定一旦你删除了第一个XXX元素,地图的按键会发生什么。所以我认为这种方式可以让我的地图更清晰。但我在这里是想提出一些建议:@andreiterators invalization正是我使用tmpMap的原因。因为,如上所述,我不太熟悉地图,处理迭代器无效是我大脑不太了解的事情。这个问题可能会有帮助。您不只是使用该方法有什么原因吗?您可以使用erase,但必须小心,因为删除迭代器会使其无效。另外,您还需要担心并发性吗?此外,除非您是在嵌入式设备上运行代码,否则600对就不算什么了。显然,如果数据量很大,这个解决方案就没有效率。我对std::map不太熟悉,我发现这种方法更简单。特别是,我不确定一旦你删除了第一个XXX元素,地图的按键会发生什么。所以我认为这种方式可以让我的地图更清晰。但我在这里是想提出一些建议:@andreiterators invalization正是我使用tmpMap的原因。因为,如上所述,我不太熟悉地图,处理迭代器无效是我大脑不太了解的事情。这个问题可能会有帮助。您不只是使用该方法有什么原因吗?您可以使用erase,但必须小心,因为删除迭代器会使其无效。另外,您还需要担心并发性吗?此外,除非您是在嵌入式设备上运行代码,否则600对就不算什么了。显然,如果数据量很大,这个解决方案就没有效率。我对std::map不太熟悉,我发现这种方法更简单。特别是,我不确定一旦你删除了第一个XXX元素,地图的按键会发生什么。所以我认为这种方式可以让我的地图更清晰。但我在这里是想提出一些建议:@andreiterators invalization正是我使用tmpMap的原因。因为,如上所述,我不太熟悉地图,处理迭代器无效是我大脑不太了解的事情。这个问题可能会有帮助。