获取迭代器正在引用的STL容器的指针
Get a pointer to STL container an iterator is referencing?
例如,以下情况是可能的:
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)。使用迭代器的全部目的是不知道元素来自哪里。另一方面,如果您想要一个迭代器,它可以让您获得指向容器的指针,那么您可以编写一个。
相关文章:
- 删除包含包含动态对象的 STL 容器的智能指针
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- STL 函数和函数类型与函数指针类型
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- 用于 STL 迭代器、指针和 std::nullptr_t 的模板函数
- 通过函数指针对类内的 STL SET 使用自定义比较器
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- 指针类型上的 STL 函数对象
- 清除 C++ 中的指针的 STL 列表
- 限制指针访问STL ::向量元素
- 有没有一种 stl 方法来执行指针向量的深度复制
- 析构函数在与 STL 的共享指针中调用两次
- 指向类的指针的 STL 映射的 SWIG 类型图
- C 指针数组使用STL开始和结束
- 使用带有COM接口的STL智能指针
- STL 算法 + c'tor 不再适用于指向 C 数组的原始指针,因为指向一个过去的末端
- STL:指针关联排序容器:排序谓词模板
- 如何删除STL指针列表