【发布时间】:2014-09-18 16:51:01
【问题描述】:
我希望std::set 的顺序与std::list 或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是 value ordered? - 那么
std::unordered_set是什么意思? - 是否有其他标准库容器可以满足我的要求?
【问题讨论】:
-
“是否有其他标准库容器可以满足我的要求?” - 你有什么要求?
-
@MikeSeymour 如上所述,我希望
std::set保持插入值的顺序,但只插入一次。这是我的要求。 -
std::set是一个有序的关联容器,通常用红黑树实现。 -
@T.C.我以前也染过这个。但它没有指定什么“顺序”(编辑:或者我错过了它,在这种情况下我很抱歉)。
-
使用您在创建集合时提供的比较器进行排序。默认为
std::less<T>。
标签: c++ c++11 stl containers stdset