用更大的向量覆盖向量的最有效方法
Most efficient way to overwrite a vector with a larger one
我有一个std::vector,我想用新元素覆盖,这也会使它更大。 执行此操作的最快/最节省内存的方法是什么? 这是我幼稚的实现:
#include <vector>
int main() {
std::vector<int> smallVec(10, 1);
int bigVecSize = 100;
smallVec.clear();
for(int i = 0; i < bigVecSize; ++i)
smallVec.push_back(i);
}
是否有任何 C++11 功能可能会有所帮助? 谢谢。
抱歉,我对 C++11 没有任何想法。
但是,我认为按::memcpy
复制内存更快.
#include <vector>
void overwrite(std::vector<int>& dst, const std::vector<int>& src)
{
/* some code - to check the valid of dst and src */
dst.resize(src.size());
::memcpy(dst.data(), src.data(), sizeof(int) * src.size());
}
int main(int argc, char* argv[])
{
// an example
std::vector<int> via, vib;
via.push_back(22);
via.resize(5, 1);
vib.push_back(123);
vib.resize(10, 2);
vib.push_back(123);
overwrite(via, vib);
return 0;
}
std::vector
的数据存储器总是随之而来的,因此您可以将存储器从一个std::vector
复制到另一个。
注意:当std::vector
的项目类型是包含/一些指针的对象时,您需要小心。因为::memcpy
只是将地址复制到另一个地址,所以不要复制指针的对象。
smallVec.reserve(bigVecSize); 可以为新元素保留足够的空间。
试试这个代码:
#include <vector>
#include <stdio.h> //for printf()
#include <stdlib.h> //for system()
#include <time.h> //for time() & time_t
int main() {
std::vector<int> smallVec(10, 1);
int bigVecSize = 1000000;
smallVec.reserve(bigVecSize);
smallVec.clear();
time_t ts,te;
ts=time(NULL);
for(int i = 0; i < bigVecSize; ++i)
smallVec.push_back(i);
te=time(NULL);
printf("%ldn",te-ts);
}
使用预留 将时间成本从 0.125s 降低到 0.087s
在C++11中,如果用户定义元素用作向量的元素,则可以使用R值引用来减少复制。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 检查两个向量是否并行的最有效方法
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何有效地实现将向量的数据分配给多个变量?
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 如何在C++中有效地将数组移动到向量
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 如何有效地用第二个值对向量对进行分组
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 如何在 CUDA 中(有效地)将大量向量相互比较
- 基于整数向量执行位排列的有效方法?
- 如何使用C++有效地合并排序与向量
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 如何有效地规范化向量C++
- remove_if然后擦除对向量有效吗
- 将一个STL向量有效地分配给另一个STL矢量(WSL问题)
- c++向量有效地添加元素