Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL vector reserve()和copy()_C++_Stl_Vector_Stl Algorithm - Fatal编程技术网

C++ STL vector reserve()和copy()

C++ STL vector reserve()和copy(),c++,stl,vector,stl-algorithm,C++,Stl,Vector,Stl Algorithm,您好 我正在尝试使用以下两行代码(完整测试应用程序如下)从一个向量(vec1)复制到另一个向量(vec2): 虽然对vec2的调用设置了vector vec2的容量,但将数据复制到vec2似乎无法填充从vec1到vec2的值 将copy()函数替换为push_back()的调用可以正常工作 我错过了什么 谢谢你的帮助。vectest.cpp测试程序,随后是结果输出 编译器:cygwin上的gcc 3.4.4 纳特 如果向量类型相同,请使用复制构造或复制赋值: vec2(vec1); vec2 =

您好

我正在尝试使用以下两行代码(完整测试应用程序如下)从一个向量(vec1)复制到另一个向量(vec2):

虽然对vec2的调用设置了vector vec2的容量,但将数据复制到vec2似乎无法填充从vec1到vec2的值

将copy()函数替换为push_back()的调用可以正常工作

我错过了什么

谢谢你的帮助。vectest.cpp测试程序,随后是结果输出

编译器:cygwin上的gcc 3.4.4

纳特
如果向量类型相同,请使用复制构造或复制赋值:

vec2(vec1);
vec2 = vec1;
如果向量不完全相同(可能是不同的分配器或其他东西,或者vec1是deque),那么您真正需要的是基于范围的构造函数或基于范围的赋值:

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));
因为保留空间并不意味着它是可分配的<代码>复制通过将每个元素指定给其新值来工作。因此,在您的情况下,
vec2.size()
至少需要与
vec1.size()
一样大。调用
reserve
实际上并不会改变向量的大小,只会改变其容量

在《有效STL》一书中,Scott Meyers认为几乎所有用于插入的std::copy都应该被基于范围的成员函数所取代。我建议你拿一份,这是一个很好的参考

将保留更改为调整大小()

我相信这就是你需要的解决办法


我不能很好地描述这种差异,但基本上reserve()确保您有足够的空间,resize()实际上会在其中插入一些内容。

为什么不:
vec2=vec1

如其他答案和评论中所述,您只需使用vector的内置功能即可。但是:

当您
reserve()
元素时,向量将为(至少?)那么多元素分配足够的空间。向量中不存在元素,但内存已准备好使用。这可能会加速
push_back()
,因为内存已分配

当您
resize()
向量时,它会为这些元素分配足够的空间,但也会将它们添加到向量中

所以如果你把一个向量调整为100,你可以访问0-99个元素,但是如果你保留了100个元素,它们还没有被插入,只是可以使用

你想要的是这样的:

vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), std::back_inserter(vec2));

在我看来,最简单的方法是使用
std::vector::insert
方法:

v2.insert(v2.end(), v1.begin(), v1.end());

(请参见)

是的,这很好:D但它确实说明了vector的resize()和reserve()之间的区别,这让我绊倒了几个小时。这对我也很有帮助,虽然不是我所要求的,但我不知道复制ctor。谢谢。简单而优雅。奇怪的是,这个简单的东西在C++中是不明显的,简单的。一开始我也意识到了这一点,真是妙极了。不仅是在发布的测试应用程序上,而且是在我使用的更复杂的问题应用程序上。我一直在避免使用resize(),因为这会添加我不打算添加的元素。感谢您的教育。您真的应该使用
vec2.分配
vec2.插入
。。。它们更优化。出于某种原因,
vec2.begin()
不编译,但只要
vec2
工作我想你应该强调“成员函数”,在最后一段中,我首先忽略了它,认为“什么?复制是基于范围的!”这是一个很好的建议,所以我们不希望人们忽略它:)
copy(vec1.begin(), vec1.end(), back_inserter(vec2));
vec2.resize(vec1.size(), '\0');
copy(vec1.begin(), vec1.end(), vec2.begin());
vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), std::back_inserter(vec2));
v2.insert(v2.end(), v1.begin(), v1.end());