对于vector,大家都很熟悉了。可以将vector看成是一个数组,区别于普通的数组,vector拥有自动扩展内存空间的能力(不必程序员自己管理内存空间)。

vector有以下特点:
  • vector支持高效地在末尾插入和删除;
  • vector支持高效的随机访问(使用[ ]运算符或者at方法);
  • 如果要在vector中间或者前面插入/删除vector有对应的inserterase的,只是由于必然引起数据块的移动(需要将之后的所有元素都向后/向前移动),无疑增加了开销,所以性能很低。

问题来了

当我们需要删除vector大量元素的时候,直接使用erase的话,时间复杂度会很大。那么,怎么操作才能使得时间复杂度小?

以下结合例子给出解决方法:

先看下面这个用法,明显不可取。但是下面这种方式,可以用在删除vector中少量数据的情况:
struct Point{
	int x=0;
	int y=0;
};
std::vector<Point> vct_;
/**-------------------------**/

auto iter = vct_.begin();
for (; iter != vct_.end();) {
  if ( iter->x > 150) {
    // 这里对vector中的大量元素进行删除操作,时间复杂度太高,不可取
    iter = vct_.erase(iter);
    continue;
  }
  ++iter;
}

对于要大量删除vector中数据的情况,就不要直接使用删除操作了,因为本来删除vector中间的某个元素时间复杂度就很高。


推荐用法

不要对vector使用大量erase删除操作,时间复杂度太高。
可以先保存vector的元素到一个临时变量vector, 然后清空vector,遍历元素中数据,不合适的数据直接continue跳过,合适的数据就push_back进源vector中。

auto vct_tmp = vct_;
vct_.clear();
for (auto &point : vct_tmp) {
  if ( point.x > 150) {
    continue; //不合格的直接跳过,这样就相当于间接删除了不合格的数据
  }
 vct_.push_back(point);
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐