为什么它不能在 c++ 中获取迭代器作为引用
Why cannot it get iterator as reference in c++?
我正在学习c++。我学会了引用可以让我们避免复制。所以我试图获取一个向量的迭代器作为引用来覆盖它的元素。
// simplified function
std::vector<int>::iterator& GetIterator(std::vector<int>& vec) {
return vec.begin(); // compiler said that here is an error.
}
但是编译器给了我一条错误消息,并建议使用常量引用。我不想使用康斯特。为什么它不能获得非常量引用?或者如何避免复制迭代器?谢谢。
有时可以使用引用来避免复制 - 但这里你需要一个副本。vec.begin()
的结果是一个临时的,当你的函数返回时,它就不复存在了。如果您希望函数之外的值 - 并且您确实这样做了 - 则需要副本。(如果你在这里成功地形成了一个引用,它将是一个"悬空的引用",这不是一件好事。
在任何情况下,许多类型都被设计为可以有效地复制,迭代器就是其中之一。事实上,编译器通常可以为您避免复制,而无需您做任何工作 - 这就是其中一种情况。
因此,没有引用的代码更容易、正确且已经是最佳的。
vec.begin();
返回一个临时对象并且是 r 值。不能将 l 值引用绑定到 r 值。从函数返回GetIterator
后,该临时对象将被销毁,您的引用将被悬挂。
按值(std::vector<int>::iterator
)返回,而不是引用。 Iterator
被设计为可复制且复制成本低廉。此外,编译器使用返回值优化来避免复制对象的成本。
正确的代码
std::vector<int>::iterator GetIterator(std::vector<int>& vec) {
return vec.begin(); // compiler said that here is an error.
}
您的&
是额外的。
迭代器就像int*
一样,得到一个地址。std::vector< type >::iterator
就是这样。
所以vector.begin()
就像&int
,所以你不能把它绑定到iterator&
相关文章:
- 不明白迭代器,引用和指针失效,一个例子
- boost_multi_index迭代器取消引用给出常量
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- 无法取消引用值初始化迭代器
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- C++不能取消引用结束列表迭代器
- 如何取消引用向量迭代器
- 在此C++代码中,迭代器引用列表的哪个元素?
- 使用双迭代器引用映射中的列表
- 使用自动迭代器引用对象
- 另一个迭代器引用的对象被另一个迭代器删除
- C++ 使用迭代器引用连续值
- 正确取消对指针的迭代器引用
- 如何在C++中存储对 stl 容器元素的指针/迭代器引用
- 具有代理迭代器/引用和auto的容器
- 返回迭代器引用C++
- 迭代器引用 std::vector<std::unique_ptr<T>>
- 迭代器引用受控序列中的元素的要求
- 什么是自动迭代器引用的 C++98 等效项?