i
在我的代码中为k
,仅为未来用户使用i
。
std::multiset<std::pair<Point::FT, int> > res;
res.erase(res.begin() + k, res.end());
错误:
不匹配运营商+
如何实现此功能?
答案 0 :(得分:3)
使用std::next
推进迭代器k
位置
res.erase(std::next(res.begin(), k), res.end());
你的代码编译失败的原因是因为std::multiset
迭代器是BidirectionalIterators,所以它们只实现了前/后增量/减量运算符,所以你需要 walk 迭代所需的位置数,std::next
将为您做。
答案 1 :(得分:0)
迭代器operator+
要求它对随机访问迭代器进行操作,因为非随机访问迭代器的加法是线性操作。 multiset
使用的迭代器是双向的,因此您无法直接添加。
如果你想在你的容器中使用索引,你应该更喜欢vector
(可能不时地排序)。或者,您可能知道要从中删除的项目的键。然后你可以使用对数时间find
来找到迭代器并从那里擦除到最后。
如果您确实需要一个已排序,可索引,有序的容器,我建议使用boost::multi_index
而不是任何标准容器。