gpt4 book ai didi

c++ - 等效于 std::map 的 remove_if

转载 作者:IT老高 更新时间:2023-10-28 11:53:30 27 4
gpt4 key购买 nike

我试图根据特定条件从 map 中删除一系列元素。如何使用 STL 算法做到这一点?

最初我想使用 remove_if 但这是不可能的,因为 remove_if 不适用于关联容器。

是否有适用于 map 的“remove_if”等效算法?

作为一个简单的选项,我想到了循环遍历 map 并删除。但是循环遍历 map 并删除一个安全的选项吗?(因为迭代器在删除后变得无效)

我使用了以下示例:

bool predicate(const std::pair<int,std::string>& x)
{
return x.first > 2;
}

int main(void)
{

std::map<int, std::string> aMap;

aMap[2] = "two";
aMap[3] = "three";
aMap[4] = "four";
aMap[5] = "five";
aMap[6] = "six";

// does not work, an error
// std::remove_if(aMap.begin(), aMap.end(), predicate);

std::map<int, std::string>::iterator iter = aMap.begin();
std::map<int, std::string>::iterator endIter = aMap.end();

for(; iter != endIter; ++iter)
{
if(Some Condition)
{
// is it safe ?
aMap.erase(iter++);
}
}

return 0;
}

最佳答案

几乎。

for(; iter != endIter; ) {
if (Some Condition) {
iter = aMap.erase(iter);
} else {
++iter;
}
}

如果您确实从中删除了一个元素,那么您原来的迭代器会增加 两次;您可能会跳过需要删除的元素。

这是我在许多地方看到使用和记录的常用算法。

[编辑] 您是正确的,迭代器在删除后无效,但只有引用被删除元素的迭代器,其他迭代器仍然有效。因此在 erase() 调用中使用 iter++

关于c++ - 等效于 std::map 的 remove_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/800955/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com