2010-10-16 63 views
0

我有一個std::set<std::string>,我想知道元素在插入後的確切位置。如何獲取一個元素的確切位置?

我試着用std::distance但沒有任何運氣:

#include <iostream> 
#include <string> 
#include <set> 
#include <iterator> 

using namespace std; 

int main (int argc, char const *argv[]) 
{ 

    string array[] = { "zero", "one", "one", "zero", "two", "three", "zero" }; 
    set<string> numbers; 
    for(size_t i = 0; i < 7; ++i) 
    { 
     int dist = distance(numbers.begin(), numbers.insert(array[i]).first); 
     cout << array[i] << "\t" << dist << endl; 
    } 
    return 0; 
} 

輸出:

zero 0 
one  0 
one  0 
zero 1 
two  1 
three 1 
zero 3 

相反,我期待這樣的:

zero 0 
one  1 
one  1 
zero 0 
two  2 
three 3 
zero 0 

任何想法?

+0

我想我會'std :: map ':)謝謝大家! – 2010-10-16 22:02:50

+0

僅供參考我在http://gist.github.com/630346上發佈瞭解決方案 – 2010-10-16 22:34:51

回答

5

他們被按字典順序排序(按字母順序基本上)。 std::set<T>的默認比較是std::less<T>,它依次調用operator<

0

首先,字符串按字典順序排序,而不是他們用英文表示的數字。其次,對於每個元素,代碼檢查集合中的當前位置,然後集合已全部更新所有元素。

乾杯&心連心,

0

如前所述,該集合通常用某種樹實現,該樹依次存儲排序的數據,而不是按照插入的順序存儲(這使得可以在O(logN)中插入等) 。如果你想要你想要的效果,你可以使用任何順序的容器 - 矢量,雙向或列表