获取指向迭代器引用的STL容器的指针?

时间:2012-07-12 04:30:40

标签: c++ stl

例如,以下是可能的:

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

我想知道相反是否可行,比方说,

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

3 个答案:

答案 0 :(得分:16)

不,没有可移植的方法来做到这一点。

迭代器甚至可能没有对容器的引用。例如,实现可以使用T*作为iteratorstd::array<T, N>的{​​{1}}类型,因为它们都将其元素存储为数组。

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

答案 1 :(得分:5)

没有。在找到迭代器时,必须记住迭代器来自的容器。

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

答案 2 :(得分:2)

至少有一个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迭代器的例子,它确实带有指向其容器的指针,尽管它是一个非常特殊的(例如,递增std::back_insert_iterator是一个空操作)。使用迭代器的重点不是要知道元素的来源。另一方面,如果你想要一个允许你获得指向容器的指针的迭代器,你可以写一个。