【问题标题】:Is passing vector's end() to std::vector::erase valid?将向量的 end() 传递给 std::vector::erase 是否有效?
【发布时间】:2013-09-17 06:13:05
【问题描述】:

一个非常简单的问题,但我找不到答案。允许它但要仔细检查会很有意义。

std::vector<int> v(10, 0);
v.erase(v.end()); // allowed or not?

【问题讨论】:

  • 这能回答你的问题吗? Erasing vector::end from vector
  • @KenY-N:是的,这是同一个问题,但这里的答案更好——我发现它们更清晰、更中肯、更容易理解。我宁愿将另一个标记为重复。

标签: c++ vector erase


【解决方案1】:

无效的位置或范围会导致未定义的行为。

来自here

迭代器 pos 必须有效且可取消引用。因此 end() 迭代器(有效,但不可取消引用)不能用作 pos 的值。

【讨论】:

  • 那太糟糕了。谢谢你。我想知道他们为什么决定这样做:使v.erase(std::find(v.begin(), v.end(), item)) 无效。
  • @VioletGiraffe 也许您正在搜索erase-remove idiomv.erase(std::remove(v.begin(), v.end(), item), v.end());
  • @Fiktik:嗯,也许吧。但是只删除一个项目似乎有点过头了。
  • @Fiktik 否。删除会继续在列表中搜索重复项。如果 std::find 有效,则 std::remove 是低效的替代品。仅当列表中存在潜在重复项时才需要使用 std::remove。
【解决方案2】:

对于单参数重载,将end() 传递给std::vector::erase 是无效的,因为单参数重载将擦除该位置的元素。 end() 位置没有元素,因为 end() 是最后一个元素的后一个。

但是,end() 可以传递给采用 Iterator 范围的 erase 的重载:

vec.erase(vec.begin(), vec.end())

【讨论】:

  • 我指的是单个参数erase 过载。
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2015-01-04
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多