我希望存储对std::vector::iterator
的引用,但下面粘贴的代码不会编译,使用指针会使事情变得笨拙。
在这种情况下最佳做法是什么(C ++ 98)?
P.S。:没有使迭代器无效的风险。
#include <stdlib.h>
#include <utility>
#include <vector>
int main(){
std::vector<int> y;
std::pair<int, std::vector<int>::iterator &> x = make_pair(5,y.begin());
};
答案 0 :(得分:2)
std::pair<int, std::vector<int>::iterator &> x = make_pair(5,y.begin());
这不会编译,因为y.begin()
会返回一个右值,因此make_pair
会返回pair<int, vector<int>::iterator>
类型的临时值,而您无法创建{{1}因为它会绑定对临时的引用。
为什么你还想要?将引用存储到pair<int, vector<int>iterator&>
返回的临时迭代器是没有意义的。你可能希望用它做什么?为什么你关心从y.begin()
引用那个特定的临时而不是任何其他迭代器值?
你可以在C ++ 11中这样做:
y.begin()
但是现在你需要保持auto it = y.begin(); // an lvalue iterator
std::pair<int, std::vector<int>::iterator &> x = make_pair(5, it);
只要你有it
,或者引用变得无效,再次,为什么?
最后,当您不尝试推断类型时,为什么还要使用x
?您可以使用make_pair
构造函数:
pair
(除非LRiO指出,在C ++ 98中,无论如何都不能在auto it = y.begin(); // an lvalue iterator
std::pair<int, std::vector<int>::iterator &> x(5, it);
中存储引用。)
答案 1 :(得分:1)
您无法直接存储引用,因为它们不可分配。
在C ++ 11中,您使用的是std::reference_wrapper
。
你可以使用指针。如果你不能这样做,因为你的输入是暂时的或者超出了范围,那么,这也是参考的问题。然后只需按值存储迭代器。
答案 2 :(得分:1)
我想存储对
的引用std::vector::iterator
...
为什么呢?迭代器是指容器中的元素(具有一些其他智能) - 为什么要保留对它的引用,只需按值存储它;他们通常非常轻松#34;无论如何对象。
在这种情况下最佳做法是什么(C ++ 98)?
按值存储。从y.begin()
返回的rvalue需要在pair
的生命周期内存储,以避免任何悬空指针或引用;只是按价值存储它。
std::pair<int, std::vector<int>::iterator> x(5, y.begin());