【问题标题】:C++ Erase-remove Idiom on non-existant value in vectorC++ Erase-remove Idiom on non-existant value in vector
【发布时间】:2020-04-29 14:14:48
【问题描述】:

我想从向量中删除一个元素,但不能保证该元素存在。 我在网上查看过,但没有找到有关擦除删除习语如何处理不在容器中的值的信息。

我的向量是这样声明的:(在代码的其他部分中添加/修改了成员)

std::vector<Person*> _members

我想在包含 _members 作为属性的类 Group 中创建一个删除方法,以尝试从组中删除给定的人。

我目前正在使用:(要删除的人是指向 Person 对象的指针)

_members.erase(std::remove(_members.begin(), _members.end(), person_to_remove), _members.end());

这将如何处理试图删除不在向量中的 Person ?理想情况下,我还想返回一个布尔值来确认删除是否成功,有没有办法用我当前的实现来做到这一点?

【问题讨论】:

  • remove 调用将迭代器返回到与要删除的值匹配的第一个元素。如果没有这个值,它将返回_members.end(),然后调用erase 将不会删除任何元素。

标签: c++ c++17 erase-remove-idiom


【解决方案1】:

这将如何处理试图删除不在向量中的人?

Erase-Remove 成语正确处理不存在的元素(以及多个元素)。

理想情况下,我还想返回一个布尔值来确认删除是否成功,我当前的实现有没有办法做到这一点?

您可以比较移除前后的尺寸:

const auto old_size = _members.size();
_members.erase(std::remove(_members.begin(), _members.end(), person_to_remove),
               _members.end());
const bool deleted = old_size != _members.size();

【讨论】:

  • 所以如果找到它就会删除它,如果元素不存在,(?)什么也不做?我很想知道它是如何具体处理的。
  • “基本上”std::remove 将元素移动到最后删除,然后我们擦除(可能为空的)已删除元素的范围。
  • 所以这里什么都不会移动吗?或者因此首先检查它是否存在然后只删除它是否更有效?
  • 如果没有元素被删除,那么什么都不会被移动,而擦除什么也不做。 2 选项是线性且相似的。
  • std::remove 将迭代空范围并返回end(),因为没有要擦除的元素。然后erase 将从空范围中删除空范围(因此无操作)。一切都很好。
猜你喜欢
  • 2017-02-06
  • 2016-10-16
  • 1970-01-01
  • 2014-07-08
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多