大家好,
我正在尝试使用以下两行简短的代码从一个向量(vec1)复制到另一个向量(vec2) (完整的测试应用程序如下所示):
vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), vec2.begin());
虽然对vec2的调用设置了向量vec2的容量,但将数据复制到vec2似乎不会填充从vec1到vec2的值。
将copy()函数替换为对push_back()的调用可以正常工作。
这里我漏掉了什么?
谢谢你的帮助。vectest.cpp测试程序,后面是结果输出。
编译器: cygwin上的gcc 3.4.4。
Nat
/**
* vectest.cpp
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1;
vector<int> vec2;
vec1.push_back(1);
vec1.push_back(2);
vec1.push_back(3);
vec1.push_back(4);
vec1.push_back(5);
vec1.push_back(6);
vec1.push_back(7);
vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), vec2.begin());
cout << "vec1.size() = " << vec1.size() << endl;
cout << "vec1.capacity() = " << vec1.capacity() << endl;
cout << "vec1: ";
for( vector<int>::const_iterator iter = vec1.begin(); iter < vec1.end(); ++iter ) {
cout << *iter << " ";
}
cout << endl;
cout << "vec2.size() = " << vec2.size() << endl;
cout << "vec2.capacity() = " << vec2.capacity() << endl;
cout << "vec2: ";
for( vector<int>::const_iterator iter = vec2.begin(); iter < vec2.end(); ++iter ) {
cout << *iter << endl;
}
cout << endl;
}
输出:
vec1.size() = 7
vec1.capacity() = 8
vec1: 1 2 3 4 5 6 7
vec2.size() = 0
vec2.capacity() = 7
vec2:
发布于 2009-07-14 22:58:04
如果向量属于同一类型,请使用复制构造或复制指定:
vec2(vec1);
vec2 = vec1;
如果向量不完全相同(可能是不同的分配器或其他东西,或者vec1是一个双队列),那么您真正需要的是基于范围的构造函数或基于范围的赋值:
vec2(vec1.begin(), vec1.end()); // range-based constructor
vec2.assign(vec1.begin(), vec1.end()); // range-based assignment
如果您坚持使用std::copy
,那么正确的方法是:
copy(vec1.begin(), vec1.end(), back_inserter(vec2));
因为保留空间并不意味着它是可分配的。copy
的工作方式是将每个元素赋给它的新值。因此,在您的情况下,vec2.size()
至少需要与vec1.size()
一样大。调用reserve
实际上不会改变向量的大小,只是改变了它的容量。
Scott Meyer在《Effective STL》一书中指出,几乎所有用于插入的std::copy都应该替换为基于范围的成员函数。我建议你买一本,这是一个很好的参考资料!
发布于 2009-07-14 23:00:00
为什么不呢:vec2 = vec1;
?
发布于 2013-01-24 18:47:57
在我看来,最简单的方法是使用std::vector::insert
方法:
v2.insert(v2.end(), v1.begin(), v1.end());
https://stackoverflow.com/questions/1128535
复制相似问题