获取迭代器正在引用的STL容器的指针

Get a pointer to STL container an iterator is referencing?

本文关键字:STL 指针 引用 迭代器 获取      更新时间:2023-10-16

例如,以下情况是可能的:

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

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

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

不,没有可移植的方法。

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

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

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

这种限制的一个可能原因是指针本应是有效的迭代器,并且无法要求指针找出它的来源(例如,如果你将4个元素指向一个数组,那么如何仅从该指针就能判断数组的开头在哪里?)。

至少有一个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)。使用迭代器的全部目的是不知道元素来自哪里。另一方面,如果您想要一个迭代器,它可以让您获得指向容器的指针,那么您可以编写一个。