C++ 从std::multiset的第i个元素删除到末尾

C++ 从std::multiset的第i个元素删除到末尾,c++,c++11,multiset,C++,C++11,Multiset,i在我的代码中是k,只是用于未来用户的i std::multiset<std::pair<Point::FT, int> > res; res.erase(res.begin() + k, res.end()); std::multiset res; res.erase(res.begin()+k,res.end()); 错误: 没有接线员的对手+ 如何实现此功能?用于提升迭代器的k位置 res.erase(std::next(res.begin(), k), res

i
在我的代码中是
k
,只是用于未来用户的
i

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

没有接线员的对手+

如何实现此功能?

用于提升迭代器的
k
位置

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

代码无法编译的原因是因为迭代器是,所以它们只实现前/后递增/递减运算符,所以需要遍历迭代器所需的位置数,哪个
std::next
可以满足您的要求。

迭代器
运算符+
要求它对随机访问迭代器进行操作,因为非随机访问迭代器的加法是一种线性操作。
multiset
使用的迭代器是双向的,因此不能进行直接加法

@裁判官回答的问题与书面回答完全一致,但我认为你试图解决错误的问题/提出错误的问题

如果您想在容器中使用索引,您应该强烈选择
vector
(可能不时排序)。或者,您可能知道要从开始到结束擦除的项的键。然后,您可以使用对数时间
find
查找迭代器,并从迭代器开始一直擦除


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

不知道
std::next
!谢谢,先生。begin()迭代器初始化变量,然后将其传递给
advance
。没有像上面那样漂亮的一行。马克,我要排序,向量不提供。此外,我知道我想到了避免删除的方法,这是唯一需要索引的部分。