【数据结构与算法】6.需要删除vector大量元素,怎样才能使得时间复杂度小?
对于vector,大家都很熟悉了。可以将vector看成是一个数组,区别于普通的数组,vector拥有自动扩展内存空间的能力(不必程序员自己管理内存空间)。vector有以下特点:vector支持高效地在末尾插入和删除;vector支持高效的随机访问(使用[ ]运算符或者at方法);如果要在vector中间或者前面插入/删除,vector有对应的insert和erase的,只是由于必然引起数据块的
·
对于vector
,大家都很熟悉了。可以将vector
看成是一个数组,区别于普通的数组,vector
拥有自动扩展内存空间的能力(不必程序员自己管理内存空间)。
vector
有以下特点:
vector
支持高效地在末尾
插入和删除;vector
支持高效的随机访问(使用[ ]运算符或者at方法);- 如果要在
vector
中间或者前面插入/删除
,vector
有对应的insert
和erase
的,只是由于必然引起数据块的移动(需要将之后的所有元素都向后/向前
移动),无疑增加了开销,所以性能很低。
问题来了
:
当我们需要删除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);
}

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