2012-11-22 61 views
9

該問題同時適用於std::setstd::unsorted_set通過迭代器獲取集合元素的「索引」

我有一個集合中的元素的迭代器。我想使用迭代器根據它在集合中的位置獲取元素的「索引」。

例如,對於我的設置將作爲指標如下:

int index = 0; 

for(MySetType::iterator begin = mySet.begin(); begin != mySet.end(); begin++) 
{ 
    cout << "The index for this element is " << index; 
    index++; 
} 

我曾嘗試使用迭代器做算術,但它不工作:

int index = mySetIterator - mySet.begin(); 

有什麼辦法根據它在集合中的位置使用迭代器來獲取像這樣的索引值?

+0

獲得兩個迭代器之間「距離」的正確方法是['std :: distance'](http://en.cppreference.com/w/cpp/iterator/distance)函數。但是,請在使用前閱讀傑克的答案。 –

回答

13

STL distance是你需要的。 std::distance(set.begin(), find_result)

請注意:

「返回第一個和最後一個元素之間的數量行爲是不確定的如果最後無法到達的第一個通過(可能重複)第一遞增。」

備註:複雜度是線性的;

3

std::setset::unordered_set關聯容器,不序列容器,指數因此這個概念本身並沒有太大的意義。

如果您需要檢索關聯容器的索引,則應更改設計(即使沒有插入最小值或最新元素的概念,此類容器中的索引可能會發生更改)。

+0

我只需要一個「索引」來鏈接元素(迭代器)以便可以寫入文件的方式設置項目。換句話說,我有一個龐大的集合迭代器列表,我不想將相同的冗餘集合元素數據寫入文件。我寧願將唯一集合元素寫入一個文件,然後將每個元素的索引寫入,將它們鏈接回特定的設置項目。 – user974967

4

std::set has just a bidirectional iterator,這意味着你不能做你想要做的事情operator +(或-)。那些只能提供random access iterators,如std::vector規定。

您需要使用std::distance才能使「索引」和std::advance從集合的開頭移動到結尾。

auto distance = std::distance(mySet.begin(), someIterator); 
auto it = mySet.begin(); 
std::advance(it, distance); 

assert(it == someIterator); 
+0

設置時距離()函數的時間複雜度是多少?是O(1)嗎? – Prince

+1

不,由於'set'只有'雙向迭代器',所以'distance'必須遍歷列表。如果它有'隨機訪問迭代器',它可能是O(1)。 – moswald