2011-07-12 38 views
1

有沒有一種方法可以使用其中一個stl算法define in來獲取集合中的一個成員使用它的索引位置?通過索引得到一個C++ std :: set的成員

我可以用類似下面的實用方法,但我必須認爲這已經存在於STL中的一些通用的形式:

ElementPtr elementAt(int elementNumber) 
{ 
    list<ElementPtr>::iterator elementIt = elements.begin(); 
    for (int counter = 0; counter < elementNumber && elementIt != elements.end(); counter++, elementIt++) 
    { 
    } 

    return *elementIt; 
} 
+1

想知道你是否可以詳細說明你需要這樣做。 – Chad

回答

1

我不這麼認爲,因爲「指數-of「在廣義的std::set方面沒有意義。除非你的集合被構造(並初始化)了一次,並且永遠不會改變,否則你不能保證對索引操作符的調用結果總是返回一個可預測的結果。

1

你將得到的最好的是一個迭代器。集合是其中值索引(以及更多哈希表中的引用)的容器。如果我們知道你在做什麼,也許我們可以更好地回答你的問題。

我想你等於一個數組;它們的結構完全不同,數字指數不適用。

+1

'std :: set'通常使用自平衡二叉樹實現。散列版本是C++ 0x的'std :: unordered_set'。 – juanchopanza

+0

謝謝,這很有趣。 – Josh

2

如果它被實現爲二叉樹或散列表,那麼它們都不是可用的索引機制,它們對於集合都是通用的。

+0

'std :: set'被實現爲自平衡二叉樹(gcc中的紅黑色)。來自C++ 0x的'std :: unordered_set'使用一個散列表。 – juanchopanza

3
#include <iterator> 

list<ElementPtr>::iterator elementIt = elements.begin(); 
std::advance(elementIt, elementNumber); 
x = *elementIt; 

這基本上做你的代碼做什麼。

但是,您希望這樣做的事實很可能表明您的數據結構是錯誤的。集合的設計不是像這樣處理的。

+0

謝謝!這是我正在尋找的。我沒有找到提前,因爲它定義在而不是。 –

2

你實際使用的是正確的容器類型嗎?考慮使用排序的向量。

2

您可以使用Boost.MultiIndex來完成此操作,以在相同的基礎數據上構建排序索引和隨機訪問索引。

0

你說設置,但你的代碼實際上指示列表。兩者不一樣。集合被設計爲通過它們的值來檢索它們的元素。列表中,您可以使用std::advance沿着它們前進。

0

有沒有這樣的事情作爲一個數字指數集。你需要使用一個矢量。更重要的是,如果您碰巧在集合中「獲得第n個項目」,則不能保證在集合被修改之後它會在那裏(在相同的地方)。

+0

這同樣適用於'vector'! – juanchopanza

相關問題