代码之家  ›  专栏  ›  技术社区  ›  Carmine Paolino

如何得到元素在集合中的确切位置?

  •  0
  • Carmine Paolino  · 技术社区  · 14 年前

    我有一个 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
    

    有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Oliver Charlesworth    14 年前

    它们正在按字典顺序(基本上按字母顺序)排序。的默认比较 std::set<T> std::less<T> ,然后调用 operator< .

        2
  •  0
  •   Cheers and hth. - Alf    14 年前

    首先,字符串按字典顺序排序,而不是按它们在英语中表示的数字排序。第二,对于每个元素,代码检查当前在集合中的位置,在集合被所有元素完全更新之前。

    干杯!

        3
  •  0
  •   Armen Tsirunyan    14 年前

    如前所述,集合通常是用某种树实现的,它依次存储排序的数据,而不是按照插入它们的顺序(这使得在O(logn)中插入等内容成为可能)。如果你想要你想要的效果,你可以使用任何顺序的容器-向量、deque或list