【问题标题】:C++ STL Set Erase by ValueC++ STL 按值设置擦除
【发布时间】:2020-01-16 08:02:27
【问题描述】:

我想从std::set 中删除一个元素。

我知道最好和直接的做法是使用set<T>::find(T val) 方法检查它在集合中的存在,然后使用返回的set<T>::iterator 擦除它。但我希望使用按值擦除的速记方法。

尽管std::set 确实通过重载函数set<T>::erase(T val) 提供了按值擦除here 中列出的值,但我无法找到如果该值不存在于集合中会发生什么。

正如人们直觉所料,如果参数值不存在于集合中,它是否什么都不做?是否保证不会抛出任何错误/异常?

【问题讨论】:

  • 来自this reference:“删除元素(如果存在的话),其键与键等效。” (强调我的)这种暗示如果与值对应的键不存在,则不会发生任何事情。
  • cplusplus.com 不是一个好的参考网站。以前比较差,现在还是不好。
  • “是否保证它不会抛出任何错误/异常?” -- 在 cppreference 上它会显示“Compare 对象抛出的任何异常。”
  • 旁注:best and straightforward practice - 取决于:如果你坚持使用std::set 并且不关心出现的次数,这并不重要,按值擦除也一样好。如果您更改容器类型或创建模板,例如,您宁愿必须意识到后果。 G。 std::vector 根本不提供按值擦除,在 std::multiset 中,您将按值擦除所有出现,而 find/erase 只会擦除一个元素(您实际上想要哪种行为???)。

标签: c++ stl set


【解决方案1】:

std::set 遵守26.2.6 associative.reqmts 的关联容器要求。

它返回实际擦除元素的数量,对于std::set,它必须是零或一,取决于存在。根据26.2.6.1 associative.reqmts.except,只有在搜索过程中使用容器比较器(显然可以自定义)不抛出时,才能保证不抛出。

【讨论】:

    【解决方案2】:

    来自cplusplus

    (1) void 擦除(迭代器位置);

    (2) size_type 擦除(const value_type& val);

    (3) 无效擦除(迭代器在前,迭代器在后);

    返回值

    对于基于值的版本 (2),该函数返回已擦除元素的数量。

    成员类型 size_type 是无符号整数类型


    所以如果没有元素被删除,则返回 0。

    【讨论】:

    • 再往下,还有一个异常安全主题,描述了“不抛出保证”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2023-04-04
    • 2011-10-24
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多