繁体   English   中英

引用std :: iterator

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM