如何从std :: set中的位置i删除项目?

时间:2017-05-17 10:19:33

标签: c++ stdset

somePtr==nullptr ? false : true

如何移除位置i处的元素?我无法使用擦除因为std::set<int> tmp_{30, 40}; int i=0; while(tmp_[i]==40) { i++; } tmp_erase(i); 不是i

3 个答案:

答案 0 :(得分:2)

[]运算符未定义为std::set,因此您无法删除指定位置的元素。您可以使用std::find按值

查找指定元素
std::set<int> tmp_{30, 40};
auto i = std::find(tmp_.begin(), tmp_.end(), 40);
tmp_.erase(i);

erase也有const key_type& key的重载,因此您只需使用erase(40)

demo

答案 1 :(得分:1)

您必须使用std::advance将迭代器移动到所需的位置,然后在该迭代器上移动std::set::erase()以删除它指向的项目并重新平衡树:

std::set<int> tmp_{30, 40, 35, 50};

// remove the second element, 35, since set is ordered 
auto it = tmp_.begin();
std::advance(it, 1); // to remove 40, advance 2, to remove 50... 3
tmp_.erase(it);

...在关联容器上执行此类操作非常常见,主要是当它们链接到窗口小部件或其他外部线性对象时,但您可能还需要考虑使用{{3如果自动重新排序不是所需的行为或std::unordered_set

答案 2 :(得分:0)

std :: set是一个关联容器,它们由平衡二叉树在内部实现。

[] 运算符不适用于集合。

你必须使用迭代器在std :: set中搜索元素,或者使用find()函数在set中查找元素然后将其删除。