对std :: iterator

时间:2016-07-15 10:33:36

标签: c++ stdvector c++98

我希望存储对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());
};

3 个答案:

答案 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());