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

Jef*_*nes 10 c++ stl

例如,以下是可能的:

std::set<int> s;  
std::set<int>::iterator it = s.begin();
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*lis 17

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

迭代器甚至可能没有对容器的引用.例如,一种实现方式可以使用T*作为iterator两个类型std::array<T, N>std::vector<T>,由于两个存储他们的元件阵列.

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

  • 这是旧的,但我有一个很小的问题。假设迭代器(不一定来自 STL)确实源自容器,它可能拥有也可能不拥有指向其原始容器的指针/引用。但是如果是这样,那么迭代器的用户绝对知道容器的类型和容器本身,不是吗?除非指向容器的指针/引用被定义为私有,当然,但程序员为什么要隐藏它呢? (2认同)

for*_*818 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);
}
Run Code Online (Sandbox Code Playgroud)

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


Kev*_*ant 5

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

这种限制的一个可能原因是指针被认为是有效的迭代器,并且没有办法让指针找出它来自何处(例如,如果你将4个元素指向一个数组,那么如何从那个指针单独指出数组的开头是?).