这里有很多答案,几乎所有答案都可以完成工作。
然而,有一些误导性的建议!
以下是选项:
vector<int> dataVec;
int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);
// Method 1: Copy the array to the vector using back_inserter.
{
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 2: Same as 1 but pre-extend the vector by the size of the array using reserve
{
dataVec.reserve(dataVec.size() + dataArraySize);
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 3: Memcpy
{
dataVec.resize(dataVec.size() + dataArraySize);
memcpy(&dataVec[dataVec.size() - dataArraySize], &dataArray[0], dataArraySize * sizeof(int));
}
// Method 4: vector::insert
{
dataVec.insert(dataVec.end(), &dataArray[0], &dataArray[dataArraySize]);
}
// Method 5: vector + vector
{
vector<int> dataVec2(&dataArray[0], &dataArray[dataArraySize]);
dataVec.insert(dataVec.end(), dataVec2.begin(), dataVec2.end());
}
长话短说,方法 4(使用 vector::insert)最适合 bsruth 的场景。
以下是一些血淋淋的细节:
Method 1可能是最容易理解的。只需复制数组中的每个元素并将其推入向量的后面即可。唉,慢了。因为存在循环(由复制函数隐含),所以必须单独处理每个元素;由于我们知道数组和向量是连续的块,因此无法提高性能。
Method 2是对方法 1 的建议性能改进;只需在添加数组之前预先保留数组的大小即可。对于大型数组这might帮助。然而,这里最好的建议是永远不要使用保留,除非分析表明您可能能够获得改进(或者您需要确保您的迭代器不会失效)。比亚恩同意 http://www.research.att.com/~bs/bs_faq2.html#slow-containers。顺便说一句,我发现这个方法执行了slowest大多数时候,尽管我很难全面解释为什么它会定期发生显著地比方法1慢...
Method 3是老派的解决方案 - 扔一些 C 来解决这个问题!对于 POD 类型运行良好且快速。在这种情况下,需要调用 resize,因为 memcpy 在向量范围之外工作,并且无法告诉向量其大小已更改。除了是一个丑陋的解决方案(字节复制!)之外,请记住,这可以仅用于 POD 类型。我永远不会使用这个解决方案。
Method 4是最好的方法。它的含义很明确,它(通常)是最快的并且适用于任何对象。对于此应用程序使用此方法没有任何缺点。
Method 5是对方法 4 的调整 - 将数组复制到向量中,然后附加它。不错的选择 - 通常快速且清晰。
最后,您知道可以使用向量代替数组,对吧?即使函数需要 C 样式数组,您也可以使用向量:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");