【问题标题】:Delete from i-th element of std::multiset to the end从 std::multiset 的第 i 个元素删除到末尾
【发布时间】:2014-11-04 19:12:12
【问题描述】:

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

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

错误:

运算符 + 不匹配

我怎样才能实现这个功能?

【问题讨论】:

    标签: c++ c++11 multiset


    【解决方案1】:

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

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

    你的代码编译失败的原因是因为std::multiset迭代器是BidirectionalIterators,所以它们只实现前/后递增/递减运算符,所以你需要遍历迭代器所需的数字职位,std::next 将为您完成。

    【讨论】:

    • 不知道std::next!谢谢先生。
    • @0x499602D2 std::advance。关于它的糟糕之处在于,因为它需要对要推进的迭代器的引用,所以您需要首先使用begin() 迭代器初始化一个变量,然后将其传递给advance。没有像上面那样漂亮的单线。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 好吧,马克,我想要订购,哪个向量不提供。此外,我知道避免删除的方法,这是唯一需要索引的部分。
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多