我有一个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功能?感谢。
答案 0 :(得分:3)
抱歉,我对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
复制到另一个{。\ n}。
注意:当std::vector
的项目类型是包含/某些指针的对象时,您需要小心。因为::memcpy
只是将地址复制到另一个地址,所以不要复制指针对象。
答案 1 :(得分:1)
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("%ld\n",te-ts);
}
使用reserve将时间成本从0.125s减少到0.087s
在C ++ 11中,如果用户定义元素用作向量元素,则可以使用R值引用来减少复制。