gpt4 book ai didi

c++ - STL vector reserve() 和 copy()

转载 作者:IT老高 更新时间:2023-10-28 21:58:57 24 4
gpt4 key购买 nike

您好,

我正在尝试使用以下 2 行缩写的代码执行从一个 vector (vec1) 到另一个 vector (vec2) 的复制(完整的测试应用程序如下):

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

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

将 copy() 函数替换为对 push_back() 的调用按预期工作。

我在这里错过了什么?

感谢您的帮助。 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;
}

输出:

vec1.size()     = 7
vec1.capacity() = 8
vec1: 1 2 3 4 5 6 7
vec2.size() = 0
vec2.capacity() = 7
vec2:

最佳答案

如果 vector 属于同一类型,则使用复制构造或复制赋值:

vec2(vec1);
vec2 = vec1;

如果 vector 不完全相同(可能是不同的分配器或其他东西,或者 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 实际上并不会改变 vector 的大小,只会改变它的容量。

Effective STL 一书中,Scott Meyers 认为几乎所有用于插入的 std::copy 都应替换为基于范围的成员函数。建议你去拿一份,很好的引用!

关于c++ - STL vector reserve() 和 copy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1128535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com