【问题标题】:How to remove items from position i in std::set?如何从 std::set 中的位置 i 删除项目?
【发布时间】:2017-05-17 10:19:33
【问题描述】:
std::set<int> tmp_{30, 40};
int i=0;
while(tmp_[i]==40)
{
    i++;
}

tmp_erase(i);

如何删除位置 i 的元素?我不能使用擦除,因为 i 不是 std::set::iteretor

【问题讨论】:

  • 套装不能这样工作。
  • 使用无序集的全部意义在于,对于那些没有“位置i”这样的东西。
  • 我建议您删除/修复代码,std::set 没有运算符 [],也不是您所要求的,并且它给出了有关问题的错误提示

标签: c++ stdset


【解决方案1】:

[] 运算符未为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&amp; key 的重载,所以你可以简单地使用erase(40)

demo

【讨论】:

  • 他想删除某个位置的项目,而不是某个值,无论如何,如果你想删除值为 40 的项目,你可以简单地使用 tmp_.erase(40) ....
  • @gabry 是的,它只反映到提供的代码(它试图找到40)。无论如何,你解决了它的位置!虽然我认为没有理由在一组中使用位置
【解决方案2】:

您必须使用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);

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 2011-02-21
      • 2021-10-19
      相关资源
      最近更新 更多