我希望 的顺序std::set
像std::list
or一样一致std::vector
,只是不会再次附加一个值。MSVC 110 证明我错了。我预计下面的代码会产生下面显示的结果,这是在 ideone ( http://ideone.com/e47GwQ ) 上运行代码时的情况(但不确定他们使用的是哪个编译器和版本)。
#include <iostream>
#include <set>
template <typename C>
int insert_get_index(C& container, typename C::value_type value)
{
typename C::iterator it = container.insert(value).first;
return std::distance(container.begin(), it);
}
int main()
{
int a = 3, b = 1, c = 9;
std::set<int*> set;
std::cout << insert_get_index(set, &a) << "\n";
std::cout << insert_get_index(set, &b) << "\n";
std::cout << insert_get_index(set, &c) << "\n";
std::cout << insert_get_index(set, &a) << "\n";
std::cout << insert_get_index(set, &b) << "\n";
std::cout << insert_get_index(set, &c) << "\n";
return 0;
}
0
1
2
0
1
2
在 Visual Studio 2012 中运行代码会产生如下所示的结果。
0
0
2
1
0
2
现在,为什么我瘦了,std::set
就像上面描述的那样?因为 cplusplus.com 声明
集合是按照特定顺序存储唯一元素的容器。
此外,还有std::unordered_set
.
- 我是否错误地理解了文档,
std::set
而是按价值排序? - 那有什么
std::unordered_set
用呢? - 是否有其他标准库容器可以满足我的要求?