【发布时间】:2015-01-15 04:35:06
【问题描述】:
我有一个 C++ STL 集。
set<unsigned> baseSet;
我在里面插入了一堆数字。
for(auto incoming : it->second.in) {
baseSet.insert(incoming);
}
现在我只想要集合中最小的 n 个元素。 (如果有帮助,我可以将集合的比较器切换到 std::greater。)集合似乎没有像向量这样的调整大小功能。我怎样才能缩短它?就地会很棒,我肯定想利用集合已排序的事实,而不是再次进行所有排序。
【问题讨论】:
-
std::set等基于节点的容器用于特殊用途,您通常不需要也不应该使用它们。使用avectorandnth_element可能会更好。 -
与向量不同,集合是专门为您不想要重复元素的情况制作的,这正是我的应用程序所需要的。
-
即便如此,向量可能更好。只需使用
std::unique。请参阅 Why you shouldn't use set (and what you should use instead) 和 Why you should avoid Linked Lists。 (第二个链接指的是链表,但该信息也可以应用于 std::set。) -
@bames53 的观点是构造集合具有复杂性
O(N lg K),其中N是插入的总数,K是不同元素的数量。将所有内容都放入一个向量中,然后将sort、unique和resize转换为n具有复杂性O(N lg N)但更有利的常数因子。如果K没有明显小于N,或者N不是“大”,则使用向量几乎肯定会更快。