根据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中很好地编译,但是我怀疑这会导致运行时问题。分段故障?内存泄漏?我不知道。
我的问题是:
end()迭代器而不引起任何运行时问题?son*_*yao 10
- 这会引起运行时问题吗?
号std :: vector :: end()按值返回。因此,v.end() = v.begin()+100;只需分配给由返回的复制的临时迭代器即可v.end()。(恰好在临时类上调用了复制赋值运算符,这仅适用于类类型。)临时变量立即被销毁,且赋值与vector无关v。
- 首先将其暴露于任意操纵是设计的缺陷吗?
只是,毫无意义。
- 是否有任何有意义的用例可以直接操作end()迭代器而不会引起任何运行时问题?
最终迭代器由其vector自身控制,您不能直接更改它。它得到通过对执行修改改vector样push_back,erase等等。
vector.end()按值返回一个迭代器。这在C ++中是完全正常的。您可以修改返回的值,但必须了解该值是副本。更改副本不会更改原件。
修改这样的临时值有意义吗?当然。*--(v.end())是一个例子。这不会改变,v.end()但是会在取消引用该副本之前减少返回的迭代器。很好,因为您不能取消引用v.end()自己。*--(v.end())已经v.back()
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |