我有一个C ++ STL集。
set<unsigned> baseSet;
我在其中插入了一堆数字。
for(auto incoming : it->second.in) {
baseSet.insert(incoming);
}
现在我只想要集合中最小的n个元素。 (如果有帮助的话,我可以将set的比较器切换到std :: greater。)set似乎没有像vector这样的resize函数。我怎样才能缩短它?就地会很棒,我肯定想利用集合排序而不是再次进行所有排序这一事实。
答案 0 :(得分:2)
选项1
if(baseSet.size() > n) { // Use appropriate case if necessary
auto it = base.begin(); // std::set<unsigned>::iterator
std::advance (it, n);
baseSet.erase(it, baseSet.end());
}
找到n th 最小元素并从该元素到结束擦除范围。
选项2
c++11以后,你也可以按照以下方式执行此操作(感谢bames53发表评论)
baseSet.erase(next(begin(baseSet), n), end(baseSet));
选项3
另一个选项(不太推荐)是在设置达到n
大小后继续删除元素。
for(auto incoming : it->second.in) {
baseSet.insert(incoming); // Insert conditionally if you bother about efficiency
if(baseSet.size() > n) baseSet.erase(baseSet.rbegin()); // rbegin not to be confused with begin
}