Mat*_*tyT 202
这里有很多答案,几乎所有答案都可以完成工作.
但是有一些误导性的建议!
以下是选项:
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());
}
Run Code Online (Sandbox Code Playgroud)
简而言之,方法4,使用vector :: insert,对于bsruth的场景是最好的.
这里有一些血腥的细节:
方法1可能是最容易理解的.只需从数组中复制每个元素并将其推入向量的背面即可.唉,这很慢.因为有一个循环(隐含了复制功能),所以必须单独处理每个元素; 基于我们知道数组和向量是连续块的事实,不能进行性能改进.
方法2是方法1的建议性能改进; 在添加之前预先保留数组的大小.对于大型阵列,这可能有所帮助 但是,这里最好的建议是永远不要使用reserve,除非分析表明你可以得到改进(或者你需要确保你的迭代器不会失效). Bjarne同意.顺便说一句,我发现这种方法在大多数时间内表现最慢,尽管我正在努力全面解释为什么它常常明显慢于方法1 ......
方法3是旧学校的解决方案 - 在问题上抛出一些C!对于POD类型,工作正常且快速.在这种情况下,需要调用resize,因为memcpy在向量的边界之外工作,并且无法告诉向量它的大小已经改变.除了是一个丑陋的解决方案(字节复制!),请记住,这只能用于POD类型.我永远不会使用这个解决方案.
方法4是最好的方法.它的意思很明确,它(通常)最快,适用于任何物体.将此方法用于此应用程序没有任何缺点.
方法5是对方法4的调整 - 将数组复制到向量中然后追加它.好的选择 - 通常快速且清晰.
最后,您知道可以使用向量代替数组,对吧?即使函数需要c样式数组,也可以使用向量:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Run Code Online (Sandbox Code Playgroud)
希望能帮到那里的人!
Dre*_*all 104
如果你在获得数组和数组大小后可以构造向量,你可以说:
std::vector<ValueType> vec(a, a + n);
Run Code Online (Sandbox Code Playgroud)
...假设a
是你的数组,它n
是它包含的元素数.否则,std::copy()
w/resize()
会做的伎俩.
memcpy()
除非您确定值是普通数据(POD)类型,否则我会远离.
此外,值得注意的是,这些都没有真正避免for循环 - 这只是一个问题,你是否必须在你的代码中看到它.复制值时,O(n)运行时性能是不可避免的.
最后,请注意,对于大多数STL算法,C样式数组是完全有效的容器 - 原始指针等效于begin()
,而(ptr + n
)等效于end()
.
Tor*_*ack 33
如果您所做的只是替换现有数据,那么您可以这样做
std::vector<int> data; // evil global :)
void CopyData(int *newData, size_t count)
{
data.assign(newData, newData + count);
}
Run Code Online (Sandbox Code Playgroud)
由于只能编辑自己的答案,因此我将根据问题的其他答案做出一个综合答案。感谢所有回答的人。
使用std :: copy,它仍然在后台进行迭代,但是您不必键入代码。
int foo(int* data, int size)
{
static std::vector<int> my_data; //normally a class variable
std::copy(data, data + size, std::back_inserter(my_data));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用常规的memcpy。这可能最适合基本数据类型(即int),但不适用于结构或类的更复杂数组。
vector<int> x(size);
memcpy(&x[0], source, size*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
小智 5
int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//source
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);
std::vector<int> myvector (dataArraySize );//target
std::copy ( myints, myints+dataArraySize , myvector.begin() );
//myvector now has 1,2,3,...10 :-)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
158461 次 |
最近记录: |