使用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()

 

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 18:02:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 18:02:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 18:02:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 18:02:06       18 阅读

热门阅读

  1. GPU系列(一):GPU 与 CPU异同

    2024-04-30 18:02:06       13 阅读
  2. 设计模式(三)、模板方法设计模式

    2024-04-30 18:02:06       13 阅读
  3. 网络安全SQL注入

    2024-04-30 18:02:06       8 阅读
  4. Web安全测试实战:SQL注入与XSS攻击的检测与防御

    2024-04-30 18:02:06       14 阅读
  5. day7 c++

    day7 c++

    2024-04-30 18:02:06      11 阅读
  6. 事件处理模式--reactor原理与实现

    2024-04-30 18:02:06       13 阅读
  7. -CS9053 Section I Assignment 7

    2024-04-30 18:02:06       12 阅读