2012-07-12 171 views
9

例如,以下是可能的:獲取迭代器引用的指向STL容器的指針?

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

不知對面是可能的,比方說,

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

我很想知道爲什麼要這樣。 – chris 2012-07-12 04:32:28

+0

我想要做的是在某些遍歷(某些其他數據結構)期間保存迭代器的狀態,以便在下次訪問時增加迭代器。如果以上是可能的,那麼我不必將引用/指針保留在容器本身,而只是指向該迭代器的指針。 – 2012-07-12 04:38:35

回答

13

不,沒有做到這一點沒有可移植的方法。

迭代器可能甚至沒有對容器的參考。例如,對於std::array<T, N>std::vector<T>,實現都可以使用T*作爲iterator類型,因爲兩者都將它們的元素存儲爲數組。另外,迭代器比容器更通用,並且並非所有迭代器都指向容器(例如,有輸入和輸出迭代器可以讀取和寫入流)。

+0

這是舊的,但我有一個非常小的問題。假設一個迭代器(不一定來自STL)確實來自一個容器,它可能會或可能不會擁有一個指向其原始包含器的指針/引用。但是如果是這樣,那麼容器的類型和容器本身對迭代器的用戶是絕對已知的,他們不是嗎?當然,除非容器的指針/引用被定義爲私有的,但爲什麼程序員想隱藏這個呢? – Mark 2016-08-18 16:31:47

5

不可以。您必須記住迭代器來自的容器,當您找到迭代器時。

這個限制的一個可能的原因是指針被認爲是有效的迭代器,並且沒有辦法要求指針來指出它來自哪裏(例如,如果你將4個元素指向一個數組,你能告訴陣列的開始在哪裏?)。

2

至少有一個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是一個空操作)。使用迭代器的重點不在於知道元素來自哪裏。另一方面,如果你想要一個可以讓你得到一個指向容器的指針的迭代器,你可以寫一個。