nat*_*soz 18 c++ stl vector stl-algorithm
问候,
我试图使用以下2个缩写的代码行(从下面的完整测试应用程序)执行从一个向量(vec1)到另一个向量(vec2)的副本:
vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), vec2.begin());
Run Code Online (Sandbox Code Playgroud)
虽然对vec2的调用设置了向量vec2的容量,但是将数据复制到vec2似乎没有填写从vec1到vec2的值.
用push_back()调用替换copy()函数按预期工作.
我在这里错过了什么?
谢谢你的帮助.然后是结果输出的vectest.cpp测试程序.
编译器:关于cygwin的gcc 3.4.4.
/**
* 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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
vec1.size() = 7
vec1.capacity() = 8
vec1: 1 2 3 4 5 6 7
vec2.size() = 0
vec2.capacity() = 7
vec2:
Run Code Online (Sandbox Code Playgroud)
rlb*_*ond 33
如果向量属于同一类型,请使用复制构造或复制分配:
vec2(vec1);
vec2 = vec1;
Run Code Online (Sandbox Code Playgroud)
如果向量是不完全相同的(可能是不同的分配什么的,或者是VEC 1一个deque),你真正想要的是基于范围的构造函数或基于范围分配:
vec2(vec1.begin(), vec1.end()); // range-based constructor
vec2.assign(vec1.begin(), vec1.end()); // range-based assignment
Run Code Online (Sandbox Code Playgroud)
如果你坚持这样做std::copy
,正确的方法是:
copy(vec1.begin(), vec1.end(), back_inserter(vec2));
Run Code Online (Sandbox Code Playgroud)
由于保留空间不会使其可分配.copy
通过将每个元素分配给其新值来工作.因此vec2.size()
需要至少与vec1.size()
您的情况一样大.调用reserve
实际上并不会改变矢量的大小,只会改变其容量.
在有效STL一书中,Scott Meyers认为几乎所有用于插入的std :: copy都应该用基于范围的成员函数替换.我建议你拿一份,这是一个很好的参考!
GMa*_*ckG 26
正如其他答案和评论中所述,您应该使用vector的内置功能.但:
当你的reserve()
元素时,向量将为(至少?)多个元素分配足够的空间.向量中不存在元素,但可以使用内存.这可能会加快,push_back()
因为内存已经分配.
当您resize()
使用向量时,它将为这些元素分配足够的空间,但也将它们添加到向量中.
因此,如果将矢量调整为100,则可以访问元素0 - 99,但如果保留100个元素,则它们尚未插入,只是准备好使用.
你想要的是这样的:
vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), std::back_inserter(vec2));
Run Code Online (Sandbox Code Playgroud)
std::back_inserter
定义于 <iterator>
归档时间: |
|
查看次数: |
21868 次 |
最近记录: |