2008-12-17 82 views
6

有什麼方法可以找到迭代器指向的容器?具體來說,我希望能夠找到std :: vector :: iterator指向的std :: vector,以便我可以檢查範圍,而不必實際將引用傳遞給該向量。查找STL迭代器的所有者

如果(如我懷疑)答案是否定的,爲什麼不呢?

編輯:謝謝你一些快速和(主要是)準確的答案。 Evan Teran釘上它。我根本沒有考慮優化,但現在很明顯。

有幾個人問我想要做什麼。這沒什麼特別重要的。我有一個對象用矢量和迭代器指向矢量初始化。如果我可以用迭代器初始化對象,那將是可愛又方便的,因爲然後我可以將vector :: iterator直接轉換爲此對象(這聽起來很奇怪,但在特定情況下確實有意義)。但這根本不重要。

回答

6

我不這麼認爲。如果迭代器必須保留一個引用/指針給那裏的所有者,那麼它們不可能被優化到一個輕量級的指針(這可以通過容器來保證連續的存儲,比如向量等)。

0

我不相信有一個暴露的方法來做到這一點。原因是,這不是迭代器的目的。當然,沒有技術上的原因,迭代器不能持有指向其父容器的指針。即使它是以不需要指針的方式實現的,它仍然可以容納它。

迭代器旨在遍歷集合,正因爲如此,他們提供做到這一點,只有必要的接口。這是很好的面向對象的編程原則。

請問您的使用情況是什麼,你需要知道有一個迭代器容器的「範圍」?

3

您無法以通用的方式從迭代器中檢索容器。至於爲什麼一個例子,一個普通的指針可以被用作迭代:

#include <algorithm> 
#include <cstdio> 
#include <cstring> 

int 
main(int argc, char *argv[]) 
{ 
     const char s[] = "Hello, world!"; 
     const char *begin = s; 
     const char *end = s + strlen(s); 

     std::for_each(begin, end, putchar); 

     return 0; 
} 

你怎麼能檢索指向原始字符串(如果不是在字符串的開頭指出的)?

但是,如果你需要這個功能,那麼你總是implement你身邊存儲到容器的引用迭代器自己的包裝。

+0

我不認爲這真的有什麼關係的問題是有人問... – jdmichal 2008-12-17 19:01:02

+3

這說明了爲什麼你不能從一個具體的和簡單的例子... – 2008-12-17 21:12:10

2

在理論上有一種方法,如果有問題的迭代器至少是前向迭代。你可以檢查你的迭代器是否是每個候選容器[first,last)中迭代器之一。由於您使用的是矢量容器,因此您有一個隨機訪問迭代器,您可以使用小於運算符來快速執行此檢查。

你必須知道所有的候選向量來檢查前端, ,這不是獲取迭代器所屬容器的一般方法。

你可以,但是,通過裝飾隨機訪問迭代器包含一個指向創建矢量東西定義隨機訪問迭代器的擴展。這可能稍微不雅,效率低下,不方便。所以看看你是否可以重寫代碼以避免這種需求。

1

STL不允許這樣做。

Vecor迭代器,例如,可被實現簡單地作爲一個指針。並且沒有通用的方法來從指向對象已分配的某些數據的指針中檢索對象。

0

正如前面建議最好是重新編寫代碼,這樣你就不需要這種行爲。這與持有一枚硬幣一樣,但你不知道它來自哪裏,除非你在紙上註明。

如果無法重寫你仍然可以引入包含一個指向容器和迭代器本身的包裝對象的代碼。你需要什麼特別的?

4

沒有辦法,使這項工作。原因很簡單:向迭代器添加一個方法以獲取它們指向的容器是

  • 毫無意義。迭代器遍歷集合。正如其他人所說,只有這些,沒有什麼更多。
  • 與迭代器的要求不兼容。記住一個指針是一個隨機訪問迭代器。將一個容器指針放入迭代器對算法來說沒有用處,因爲它們打算是通用的,與特定的迭代器實現分離。用作迭代器的指針不能有指向它作爲成員的數組的指針。

你說你需要它的範圍檢查。您可以提供一個結束迭代器,它指向範圍的最後一個有效迭代器位置之後的一個點。檢查你的當前位置是否沒有結束。這就是你需要做的範圍檢查。