17

例如,以下是可能的:

std::set<int> s;  
std::set<int>::iterator it = s.begin();

我想知道相反的情况是否可能,比如说,

std::set<int>* pSet = it->**getContainer**();  // something like this...
4

3 回答 3

22

不,没有便携的方法可以做到这一点。

迭代器甚至可能没有对容器的引用。例如,一个实现可以同时用作和T*iterator类型,因为两者都将它们的元素存储为数组。std::array<T, N>std::vector<T>

此外,迭代器比容器更通用,并不是所有的迭代器都指向容器(例如,有输入和输出迭代器从流中读取和写入)。

于 2012-07-12T04:32:09.660 回答
7

不可以。在找到迭代器时,您必须记住迭代器来自的容器。

这种限制的一个可能原因是指针应该是有效的迭代器,并且没有办法让指针找出它来自哪里(例如,如果您将 4 个元素指向一个数组,那么您如何仅从该指针中判断出哪里数组的开头是?)。

于 2012-07-12T04:35:37.193 回答
6

至少有一个std迭代器和一些技巧是可能的。std::back_insert_iterator需要一个指向容器的指针来调用它的方法push_back。而且这个指针是protected唯一的。

#include <iterator>

template <typename Container>
struct get_a_pointer_iterator : std::back_insert_iterator<Container> {
    typedef std::back_insert_iterator<Container> base;
    get_a_pointer_iterator(Container& c) : base(c) {}
    Container* getPointer(){ return base::container;}
};

#include <iostream>
int main() {
    std::vector<int> x{1};
    auto p = get_a_pointer_iterator<std::vector<int>>(x);
    std::cout << (*p.getPointer()).at(0);
}

std这当然没有实际用途,而只是一个确实携带指向其容器的指针的迭代器的示例,尽管是一个非常特殊的示例(例如,递增 astd::back_insert_iterator是一个 noop)。使用迭代器的全部意义在于不知道元素来自哪里。另一方面,如果您想要一个迭代器来获取指向容器的指针,您可以编写一个。

于 2017-08-31T20:26:33.127 回答