簡體   English   中英

獲取指向迭代器引用的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)。 使用迭代器的重點不是要知道元素的來源。 另一方面,如果你想要一個允許你獲得指向容器的指針的迭代器,你可以寫一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM