[英]Reference to std::iterator
我想存储对std::vector::iterator
的引用,但诸如下面粘贴的代码之类的代码无法编译,并且使用指针会使事情变得笨拙。
在这种情况下(C ++ 98)的最佳做法是什么?
PS:没有使迭代器无效的风险。
#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());
};
std::pair<int, std::vector<int>::iterator &> x = make_pair(5,y.begin());
这不会编译,因为y.begin()
返回一个右值,因此make_pair
返回一个类型为pair<int, vector<int>::iterator>
的临时类型,并且您无法创建pair<int, vector<int>iterator&>
,因为它将绑定对临时对象的引用。
您为什么仍然要? 存储对 y.begin()
返回的临时迭代器的引用没有任何意义。 您可能希望如何处理? 您为什么要关心从y.begin()
而不是其他迭代器值引用该特定临时变量?
您可以在C ++ 11中这样做:
auto it = y.begin(); // an lvalue iterator
std::pair<int, std::vector<int>::iterator &> x = make_pair(5, it);
但是现在只要有x
,就需要保持it
不停旋转,否则引用将变为无效,这又是为什么呢?
最后,当您不尝试推断类型时,为什么还要麻烦使用make_pair
? 您可以只使用pair
构造函数:
auto it = y.begin(); // an lvalue iterator
std::pair<int, std::vector<int>::iterator &> x(5, it);
(除了LRiO指出的那样,在C ++ 98中,无论如何都不能pair
存储引用。)
您不能直接存储引用,因为它们是不可分配的。
在C ++ 11中,您将使用std::reference_wrapper
。
您可以只使用一个指针。 如果由于输入是临时输入或超出范围而不能执行此操作,那么也存在参考问题。 然后只需按值存储迭代器 。
我想存储对
std::vector::iterator
的引用...
为什么? 迭代器引用容器中的元素(具有其他一些智能)-为什么要保留对它的引用,只按值存储它; 无论如何,它们通常都是非常“轻”的物体。
在这种情况下(C ++ 98)的最佳做法是什么?
按值存储。 从y.begin()
返回的右值将需要在该pair
的有效期内存储,以避免任何悬空的指针或引用。 只需按值存储即可。
std::pair<int, std::vector<int>::iterator> x(5, y.begin());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.