您何时会直接更改std :: vector :: end()?

jam*_*mes 5 c++

根据c ++参考vector::end()声明为iterator end() noexcept;(第一种形式)。

这是否意味着我们可以像下面这样直接操作它?

vector<int> v(10);
v.end() = v.begin()+100; // change its end iterator arbitrarily
Run Code Online (Sandbox Code Playgroud)

这可以在clang中很好地编译,但是我怀疑这会导致运行时问题。分段故障?内存泄漏?我不知道。

我的问题是:

  1. 这会引起运行时问题吗?
  2. 首先将其暴露于任意操纵是设计的缺陷吗?
  3. 是否有任何有意义的用例可以直接操作end()迭代器而不引起任何运行时问题?

son*_*yao 10

  1. 这会引起运行时问题吗?

std :: vector :: end()按值返回。因此,v.end() = v.begin()+100;只需分配给由返回的复制的临时迭代器即可v.end()。(恰好在临时类上调用了复制赋值运算符,这仅适用于类类型。)临时变量立即被销毁,且赋值与vector无关v

  1. 首先将其暴露于任意操纵是设计的缺陷吗?

只是,毫无意义。

  1. 是否有任何有意义的用例可以直接操作end()迭代器而不会引起任何运行时问题?

最终迭代器由其vector自身控制,您不能直接更改它。它得到通过对执行修改改vectorpush_backerase等等。


MSa*_*ers 6

vector.end()按值返回一个迭代器。这在C ++中是完全正常的。您可以修改返回的值,但必须了解该值是副本。更改副本不会更改原件。

修改这样的临时值有意义吗?当然。*--(v.end())是一个例子。这不会改变,v.end()但是会在取消引用该副本之前减少返回的迭代器。很好,因为您不能取消引用v.end()自己。*--(v.end())已经v.back()