保留最小的n个元素,丢弃其他元素

时间:2014-11-18 04:39:19

标签: c++ c++11 stl set

我有一个C ++ STL集。

set<unsigned> baseSet;

我在其中插入了一堆数字。

for(auto incoming : it->second.in) {
    baseSet.insert(incoming);
}

现在我只想要集合中最小的n个元素。 (如果有帮助的话,我可以将set的比较器切换到std :: greater。)set似乎没有像vector这样的resize函数。我怎样才能缩短它?就地会很棒,我肯定想利用集合排序而不是再次进行所有排序这一事实。

1 个答案:

答案 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

以后,你也可以按照以下方式执行此操作(感谢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
}