代码之家  ›  专栏  ›  技术社区  ›  Leonid

如何删除C++地图中最后的n个元素?

  •  2
  • Leonid  · 技术社区  · 14 年前

    有没有一个简单的方法 nth element C++ std::map ? 特别是我在寻找一个算法来删除最后一个 k 来自 map 打电话给我 std::map::erase . 其要求是不受复杂性的影响-这应该可以删除中的元素范围 O(N) .

    std::vector std::nth_element std::map::find 找到迭代器以便找出从何处删除。

    标准::地图 在要删除的元素数上维护一个计数器变量。那会给你 O(n) for 循环 STL algorithm ?

    2 回复  |  直到 14 年前
        1
  •  9
  •   Doug    14 年前

    地图不能提供比线性索引更好的元素访问,比如 vector deque std::advance ,但所需时间与 k . 如果 k公司 指针。举个例子:

    template<typename Map>
    void erase_last_elements(Map & map, ptrdiff_t k)
    {
        assert(k >= 0);
        assert(map.size() >= (size_t)k);
        typename Map::iterator i = map.end();
        std::advance(i, -k);
        map.erase(i, map.end());
    }
    

    或者,如果您使用的是Boost,那么可以使用 boost::prior

    template<typename Map>
    void erase_last_elements(Map & map, ptrdiff_t k)
    {
        assert(k >= 0);
        assert(map.size() >= (size_t)k);
        typename Map::iterator i = boost::prior(map.end(), k);
        map.erase(i, map.end());
    }
    

    否则,您将不得不维护一个单独的索引,或者使用不同的容器。有点像分类的 如果不太多地插入和删除元素,可能会比较合适。

        2
  •  0
  •   Shamim Hafiz - MSFT    14 年前

    :原帖编辑后答案不适用。