我有一个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 :(得分:5)
它们按字典顺序排序(基本上按字母顺序排列)。 std::set<T>
的默认比较为std::less<T>
,后者又调用operator<
。
答案 1 :(得分:0)
首先,字符串按字典顺序排序,而不是用英语表示的数字。其次,对于每个元素,代码在使用所有元素完全更新集合之前检查集合中的当前位置。
干杯&amp;第h。,
答案 2 :(得分:0)
如上所述,该集合通常使用某种树来实现,该树依次存储已排序的数据,而不是按照插入它们的顺序(这使得可以在O(logN)中插入等)。如果您需要所需的效果,可以使用任何顺序容器 - 矢量,双端队列或列表