改进矢量分配和清晰

Improvement over vector assignment and clear

本文关键字:清晰 分配      更新时间:2023-10-16

我多次处理这种类型的代码:

vector<int>prev,cur;
for(i=1;i<n;i++){       
    //do some operation on cur based on prev vector
    prev = cur;
    cur.clear();
}

是否有时间复杂度改善的范围?由于clear的时间复杂度就其元素而言是线性的(调用容器析构函数),是否有任何方法可以在0(1)或更少的时间内通过任何其他方法完成此操作?我应该使用指向向量的指针,然后改变指针来执行

操作吗?

prev = cur

1)您当前的方法需要元素的副本(这是O(n))和cur的清除(原则上O(n)调用析构函数,但这对于基本类型(如示例中的int)不应该是性能问题)。

2) bhzad推荐的 swap() 。努里在他的评论中交换了这两个向量的元素。从性能的角度来看,您可以将其想象为指针的交换。不管它是如何实现的,交换都是在常量时间内完成的。交换之后,cur中仍然有数据,因此可能需要对其进行clear()

3)指向向量的指针看起来很丑。矢量交换在性能方面得到了相同的结果,并且更加优雅!

我的建议是使用move语义而不是swap:

for(i=1;i<n;i++){       
    //do some operation on cur based on prev vector
    prev = std::move(cur);
    cur.clear();
}