【数据结构与算法】6.需要删除vector大量元素,怎样才能使得时间复杂度小?
·
对于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);
}
更多推荐
所有评论(0)