使用std::copy_n 对std::vector 拷贝数据时需要注意

std :: copy_n()函数的语法

    std::copy_n(iterator source_first, size, iterator target_start);

关于第一和第三个参数,这里需要注意是用的iterator 。

关于第二个参数size,需要注意,这个iterator 所指向的容器的元素个数,比如这里是std::vector,std::array 等,这里需要调用的是size()这个接口,返回的是元素个数,而不是多少个Byte.

#include <iostream>
#include <algorithm>
#include <vector>
#include <array>

using namespace std;

void printLog(std::vector<int> vec)
{
    //printing vector
    cout << "v1: ";
    for (int x : vec)
        cout << x << " ";
    cout << endl;

}

void printLog(std::array<int, 5> arr,int size)
{
    //printing vector
    cout << "arr: ";
    for (int i = 0;i < size; i++)
        cout << arr[i] << " ";
    cout << endl;

}

int main()
{
    //declaring & initializing an int array
    std::array<int, 5> arr = { 10, 20, 30, 40, 50 };
    //vector declaration
    vector<int> v1(5);

    //copying 5 array elements to the vector
    std::copy_n(arr.begin(), v1.size(), v1.begin());
    // copy_n(arr.begin(), arr.size(), v1.begin()); // same above, size is 5

    printLog(arr,arr.size());
    printLog(v1);
    return 0;
}

输出结果:

arr: 10 20 30 40 50
v1: 10 20 30 40 50

关于std::vector 这里需要注意,在执行拷贝的时候,要确认报std::vector 已经申请好足够的内存,正常调用push_back添加成员,是会动态申请内存的,vector 在没有初始化的情况下,size()的值是0,如果这时候直接向这个vector 对象拷贝数据会报错如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <array>

using namespace std;

void printLog(std::vector<int> vec)
{
    //printing vector
    cout << "v1: ";
    for (int x : vec)
        cout << x << " ";
    cout << endl;

}

void printLog(std::array<int, 5> arr,int size)
{
    //printing vector
    cout << "arr: ";
    for (int i = 0;i < size; i++)
        cout << arr[i] << " ";
    cout << endl;

}

int main()
{
    //declaring & initializing an int array
    std::array<int, 5> arr = { 10, 20, 30, 40, 50 };
    //vector declaration
    vector<int> v1;  // 这里没有初始化

    //copying 5 array elements to the vector
    std::copy_n(arr.begin(), arr.size(), v1.begin());

    printLog(arr,arr.size());
    printLog(v1);
    return 0;
}

上面的代码没有对v1进行初始化,直接使用std::copy_n 拷贝数据,代码跑起来直接报错:

Segmentation fault

std::vector 的初始化方式有很多种,可以使用如下方式初始化:

std::vector<int> vec {};

std::vector<int> vec {0,1,4};

std::vector<int> vec(5);

std::vector<int> vec; vec.resize(5);

。。。

 

Reference: C++ std::copy_n()

参考: C ++ std :: copy_n()

 

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值