STL矢量保留()和复制()

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我正在尝试使用以下两行代码执行从一个向量(vec1)到另一个向量(vec2)的副本:

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

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

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

我在这里错过了什么?

谢谢你的帮助。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: 
提问于
用户回答回答于

应该只使用vector的内置功能。

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

因此,如果将矢量大小调整为100,则可以访问元素0 - 99,但是如果保留100个元素,则它们尚未插入,只是准备好使用。

你想要的是这样的:

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

std::back_inserter 被定义在 <iterator>

用户回答回答于

如果载体类型相同,则使用复制构造或复制分配:

vec2(vec1);
vec2 = 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));

所属标签

可能回答问题的人

  • 找虫虫

    0 粉丝0 提问6 回答
  • 爸爸

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答
  • uncle_light

    5 粉丝518 提问5 回答
  • 优惠活动秘书

    0 粉丝2 提问4 回答

扫码关注云+社区

领取腾讯云代金券