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