【发布时间】: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 只会擦除一个元素(您实际上想要哪种行为???)。