如何获取集合中元素的确切位置?

时间:2010-10-16 21:19:11

标签: c++ stl

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

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

干杯&amp;第h。,

答案 2 :(得分:0)

如上所述,该集合通常使用某种树来实现,该树依次存储已排序的数据,而不是按照插入它们的顺序(这使得可以在O(logN)中插入等)。如果您需要所需的效果,可以使用任何顺序容器 - 矢量,双端队列或列表