【发布时间】:2014-11-04 19:12:12
【问题描述】:
i 在我的代码中是k,只是将i 用于未来的用户。
std::multiset<std::pair<Point::FT, int> > res;
res.erase(res.begin() + k, res.end());
错误:
运算符 + 不匹配
我怎样才能实现这个功能?
【问题讨论】:
i 在我的代码中是k,只是将i 用于未来的用户。
std::multiset<std::pair<Point::FT, int> > res;
res.erase(res.begin() + k, res.end());
错误:
运算符 + 不匹配
我怎样才能实现这个功能?
【问题讨论】:
使用std::next 推进迭代器k 位置
res.erase(std::next(res.begin(), k), res.end());
你的代码编译失败的原因是因为std::multiset迭代器是BidirectionalIterators,所以它们只实现前/后递增/递减运算符,所以你需要遍历迭代器所需的数字职位,std::next 将为您完成。
【讨论】:
std::next!谢谢先生。
std::advance。关于它的糟糕之处在于,因为它需要对要推进的迭代器的引用,所以您需要首先使用begin() 迭代器初始化一个变量,然后将其传递给advance。没有像上面那样漂亮的单线。
迭代器operator+ 要求它对随机访问迭代器进行操作,因为非随机访问迭代器的加法是线性操作。 multiset 使用的迭代器是双向的,所以不能直接加法。
@Praetorian 完全按照书面形式回答了这个问题,但我要争辩说你试图解决错误的问题/提出了错误的问题。
如果你想在你的容器中使用索引,你应该更喜欢vector 代替(可能不时排序)。或者,您可能知道要擦除到最后的项目的 key。然后您可以使用对数时间find 找到迭代器并从那里擦除到结束。
如果您确实需要一个排序的、可索引的、有序的容器,我建议使用boost::multi_index 而不是任何标准容器。
【讨论】: