我有一个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值引用来减少复制。