被这个问题困扰了很多次,有必要整理一下。

当然最好的参考资料就是http://www.cplusplus.com/reference/set/set/erase/ 里的Complexcity部分了,但是有必要记住常见的一些复杂度。否则会掉坑的。

先来看一下vector的erase复杂度:

Linear on the number of elements erased (destructions) plus the number of elements after the last element deleted (moving).

析构函数的复杂度和后面要移动的复杂度,所以一般情况下如果不是删除最后一个(当然删除最后一个直接用pop_back()就可以了)是O(1)外,其它都是O(n),即线性的。

再来看一下set的erase复杂度如下,它有三种情况的erase,复杂度不同

(1)iterator erase (const_iterator position);
(2) size_type erase (const value_type& val);

>(3) iterator erase (const_iterator first, const_iterator last);

For the first version (erase(position)), amortized constant.
For the second version (erase(val)), logarithmic in container size.
For the last version (erase(first,last)), linear in the distance between first and last.

第一种方法也就是删除迭代器的位置,复杂度是摊销常数;第二种方法也就是直接删除一个常数,复杂度是log,最后一种删除一段区间,复杂度是O(n)

可以看到,如果我们的序列本身有序并且删除的位置可以确定或者值确定,那么用vector会很慢,这时可以考虑set或者是手写erase类似这种

 
1
2
3
4
5
auto linear_erase=[](auto& v, const size_t index){
    std::swap(v[index], v.back());
    v.pop_back();
};
 
转载自:http://www.ohazyi.com/erase-complexcity/

C++关于erase的复杂度(转载)的更多相关文章

  1. [POJ3694]Network(LCA, 割边, 桥)

    题目链接:http://poj.org/problem?id=3694 题意:给一张图,每次加一条边,问割边数量. tarjan先找出所有割边,并且记录每个点的父亲和来自于哪一条边,然后询问的时候从两 ...

  2. bitcode?

    今天在网站上看到一篇关于第三方库不包含bitcode就会报错的文章,感觉剖析得很详细,分享出来,希望可以对iOS初入门者有所帮助.下面我们就一起来看看吧. 用Xcode 7 beta 3在真机(iOS ...

  3. stl lower_bound()和up_bound()

    iter=data.erase(iter);删掉 转载:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html STL中的每个算法 ...

  4. 【题解】Luogu P5471 [NOI2019]弹跳

    原题传送门 先考虑部分分做法: subtask1: 暴力\(O(nm)\)枚举,跑最短路 subtask2: 吧一行的点压到vector中并排序,二分查找每一个弹跳装置珂以到达的城市,跑最短路 sub ...

  5. [hdu 4841]圆桌问题 | 约瑟夫问题 STL-vector

    原题 问题描述: 经典的约瑟夫问题,有2n个人,其中n个好人n个坏人,使得删去n人后,剩下的全为好人.m为每次数的人数. n<=32767 题解: 首先考虑n的范围,暴力肯定行不通,所以会想到线 ...

  6. 【转载】STL 的 erase() 陷阱-迭代器失效总结

    下面材料整理自Internet&著作. TL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.se ...

  7. [转载]Go的50度灰:Golang新开发者要注意的陷阱和常见错误

    初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shadow ...

  8. 余弦相似度-Cosine Similar(转载)

    余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小.相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上. 与欧几里德距离类似,基于余弦相似度的计算方法也是把用 ...

  9. Ubuntu中root用户和user用户的相互切换[转载自93度的饼干]

    Ubuntu中root用户和user用户的相互切换 Ubuntu是最近很流行的一款Linux系统,因为Ubuntu默认是不启动root用户,现在介绍如何进入root的方法. (1)从user用户切换到 ...

随机推荐

  1. Cassandra 安装部署

    Linux 系统安装Cassandra 一.Cassandra需要安装jdk支持,首先安装jdk 自行百度查找安装 二.下载Cassandra 官网地址: https://cassandra.apac ...

  2. springboot 集成apollo,根据不同环境加载配置

  3. Linux培训教程 linux系统下分割大文件的方法

    在linux中分割大文件,比如一个5gb日志文件,需要把它分成多个小文件,分割后以利于普通的文本编辑器读取. 有时,需要传输20gb的大文件,Linux培训 教程件到另一台服务器,也需要把它分割成多个 ...

  4. 关于Fibonacci博弈的一些学习

    关于Fibonacci博弈的一些学习 一道例题 问题 给定n(n≥2)个石头,游戏双方轮流取至少一个石子,取到最后一个石子的人算赢,但是要满足一下规则: 第一次取不能全部取完所有的石子. 设前一次取的 ...

  5. Vue中基本指令用法

    指令在Vue中是个很重要的功能,在Vue项目中是必不可少的.根据官网的介绍,指令 (Directives) 是带有 v- 前缀的特殊属性.指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地 ...

  6. 大哥带的Orchel数据库的注入

    0X01 先进行判断 a.jsp?username=SMITH and = 发现单引号闭合  我们尝试构造闭合  存在注入 a.jsp?username=SMITH'='1 正确 a.jsp?user ...

  7. python常用笔记

    A trick when you want to flatten a matrix X of shape (a,b,c,d) to a matrix X_flatten of shape (b*c*d ...

  8. leetcode-mid-dynamic programming-55. Jump Game

    mycode  71.47% 思路: 既然要到达终点,那么俺就可以倒推,要想到达n,可以有以下情况 1)到达n-1,然后该位置最少可以走一步 2)到达n-2,然后该位置最少可以走两步 3)到达n-3, ...

  9. 十七、RF中的等待时间

    1.sleep:强制等待n秒 sleep  秒数 2.implicit wait 隐式等待 2.1 get selenium implicit wait  :取隐式等待时间,隐式等待时间默认为0 2. ...

  10. leetcode 107.Binary Tree Level Order Traversal II 二叉树的层次遍历 II

    相似题目: 102 103 107 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode ...