![](/img/trans.png)
[英]How to store pointer / iterator reference to stl container element in C++?
[英]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)。 使用迭代器的重點不是要知道元素的來源。 另一方面,如果你想要一個允許你獲得指向容器的指針的迭代器,你可以寫一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.