从std :: multiset的第i个元素删除到结尾

时间:2014-09-11 00:38:33

标签: c++ c++11 multiset

i在我的代码中为k,仅为未来用户使用i

std::multiset<std::pair<Point::FT, int> > res;
res.erase(res.begin() + k, res.end());

错误:

不匹配运营商+

如何实现此功能?

2 个答案:

答案 0 :(得分:3)

使用std::next推进迭代器k位置

res.erase(std::next(res.begin(), k), res.end());

你的代码编译失败的原因是因为std::multiset迭代器是BidirectionalIterators,所以它们只实现了前/后增量/减量运算符,所以你需要 walk 迭代所需的位置数,std::next将为您做。

答案 1 :(得分:0)

迭代器operator+要求它对随机访问迭代器进行操作,因为非随机访问迭代器的加法是线性操作。 multiset使用的迭代器是双向的,因此您无法直接添加。

@Praetorian完全按照书面回答了这个问题,但我会争辩说你正试图解决错误的问题/提出错误的问题。

如果你想在你的容器中使用索引,你应该更喜欢vector(可能不时地排序)。或者,您可能知道要从中删除的项目的。然后你可以使用对数时间find来找到迭代器并从那里擦除到最后。

如果您确实需要一个已排序,可索引,有序的容器,我建议使用boost::multi_index而不是任何标准容器。

相关问题