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

18
例如,以下是可能的:
std::set<int> s;  
std::set<int>::iterator it = s.begin();

我想知道是否有可能反过来实现,比如说:

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

我很想知道你为什么想要这个。 - chris
我想要做的是在某些遍历(其他数据结构的)期间保存迭代器的状态,以便我可以在下一次访问中递增迭代器。如果上述操作是可能的,那么我就不必保留对容器本身的引用/指针,而只需保留对该迭代器的指针即可。 - Jeffrey Goines
3个回答

23
不,没有可移植的方法来做到这一点。
迭代器甚至可能没有对容器的引用。例如,实现可以将T*用作std :: array 和std :: vector 的iterator类型,因为两者都将其元素存储为数组。
此外,迭代器比容器更通用,并且并非所有迭代器都指向容器(例如,有读取和写入流的输入和输出迭代器)。

2
这是一个老问题,但我有一个非常小的问题。假设一个迭代器(不一定来自STL)确实起源于一个容器,它可能具有指向其原始容器的指针/引用,也可能没有。但是,如果它确实具有指针/引用,则容器的类型和容器本身对迭代器的用户来说是绝对已知的,不是吗?除非将指向容器的指针/引用定义为私有,当然,但是为什么程序员要隐藏这个呢? - Mark

8
不,你必须在找到迭代器的同时记住它来自哪个容器。
这个限制可能是因为指针被认为是有效的迭代器,而且没有办法让指针知道它来自哪里(例如,如果你将指针指向数组的第4个元素,仅凭指针就无法确定数组的起始位置在哪里)。

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迭代器确实携带了指向其容器的指针,尽管它是非常特殊的(例如,对std::back_insert_iterator进行增量操作是一个noop)。使用迭代器的整个关键在于不知道元素来自哪里。另一方面,如果您曾经想过需要一个允许您获取指向容器的指针的迭代器,那么您可以编写一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接