改进矢量分配和清晰
Improvement over vector assignment and clear
我多次处理这种类型的代码:
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();
}
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 改进矢量分配和清晰