乐闻世界logo
搜索文章和话题

Deleting elements from std::set while iterating

1 个月前提问
1 个月前修改
浏览次数15

1个答案

1

在C++中,std::set是一个存储唯一元素的容器,它按特定的排序顺序存储元素,通常是使用元素的自然排序。当你在迭代std::set时删除元素,需要注意不破坏迭代器的有效性。std::set的迭代器在删除元素后会失效,因此需要小心处理。

以下是在迭代std::set时删除元素的正确方法:

示例代码

cpp
#include <iostream> #include <set> int main() { std::set<int> mySet = {1, 2, 3, 4, 5}; for (auto it = mySet.begin(); it != mySet.end(); /* nothing here */) { if (*it % 2 == 0) { // 条件:如果是偶数,则删除 it = mySet.erase(it); // erase函数返回下一个有效的迭代器 } else { ++it; // 只有在不删除元素的时候自增迭代器 } } // 输出修改后的集合内容 std::cout << "Modified set: "; for (auto element : mySet) { std::cout << element << " "; } std::cout << std::endl; return 0; }

代码解释

  1. 初始化和填充集合:首先,创建一个std::set<int>并初始化为1到5的整数。
  2. 迭代并检查条件:通过使用迭代器来遍历集合。如果元素满足某个条件(在此示例中检查是否是偶数),则使用erase函数删除该元素。
  3. 安全删除erase函数会删除当前指向的元素,并返回指向下一个元素的迭代器。这确保了即使删除了元素,迭代器也不会失效。
  4. 增加迭代器:只有在不删除当前元素时才手动增加迭代器。

这种方法确保了在迭代过程中集合的结构不会因为删除操作而被破坏,同时迭代器始终有效。这是处理类似情形的推荐做法。

2024年8月7日 18:05 回复

你的答案