C++进阶之迭代器复制std::copy:用法实例(三百九十一)

C++迭代器复制std::copy用法实例

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者

新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🌻1.前言

本篇目的:C++进阶之迭代器复制std::copy:用法实例

🌻2. C++迭代器复制std::copy介绍

  1. 基本概念
    std::copy 是 C++ 标准库中的通用算法,定义于 <algorithm> 头文件中,其作用是将一个范围内的元素复制到另一个位置。它是 STL 中最基础且常用的数据移动算法之一,常用于将数组、容器或迭代器范围内的数据转移到新位置或新容器中。

  2. 功能
    该函数接受三个参数:起始迭代器、结束迭代器和目标迭代器。它从源范围 [first, last) 中依次复制元素到从目标位置 d_first 开始的区域,直到源范围的所有元素被复制完毕。返回值是指向目标区域中最后一个被复制元素之后的位置。

  3. 迭代器要求
    源范围的两个迭代器 firstlast 必须至少为输入迭代器,能够进行只读访问;目标迭代器 d_first 必须为输出迭代器,能够写入数据。这种设计保证了 std::copy 可以应用于多种不同的迭代器类型,包括指针和容器迭代器。

  4. 元素复制方式
    元素的复制是通过赋值操作 *d_first = *first 完成的,因此所操作的对象类型必须是可赋值的。如果对象类型存在拷贝构造函数或拷贝赋值运算符,std::copy 将按值复制对象。如果对象不可拷贝,该算法将无法使用并在编译时报错。

  5. 性能特性
    std::copy 的时间复杂度为线性,即 O(n),其中 n 是被复制元素的数量。对于随机访问迭代器,如数组或 std::vector 的迭代器,算法可以进行指针加法优化以提高效率。对于链表等不支持随机访问的容器,它会逐个处理元素。

  6. 使用限制
    源范围和目标范围不应重叠,否则将导致未定义行为。在存在重叠的情况下,应该使用 std::copy_backward 以保证复制顺序的正确性。此外,目标范围必须有足够的空间来容纳所有被复制的元素,否则可能引发越界写入错误。

  7. 使用场景
    std::copy 在容器初始化、数据备份、子区间提取、输出重定向等场景中非常有用。由于其通用性和高性能,在 STL 算法体系中占有核心地位,是实现各种算法的基础构件之一。借助 std::copy,程序员能够高效地进行数据传输与重组。

🌻3. 代码实例

🐓3.1 将一个容器中的元素复制到另一个容器中

  • 1.应用场景:
    当你想将一个容器的全部或部分内容复制到另一个容器中时,std::copy 提供了一种高效且通用的方法。
    常用于数据迁移、初始化新容器或缓存内容。
  • 2.通用语法:
std::copy(src_begin, src_end, dest_begin);

  • 3.用法实例
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> src = {1, 2, 3, 4};
    std::vector<int> dest(4);  // 必须提前分配足够空间

    std::copy(src.begin(), src.end(), dest.begin());

    for (int n : dest) std::cout << n << " ";
    // 输出: 1 2 3 4

    return 0;
}

std::copy 不会改变目标容器的大小,因此目标容器必须预先分配足够空间。
适用于任意支持迭代器的容器,如 vector, deque, array 等。

🐓3.2 数组与容器相互copy

  • 1.应用场景:
    当你需要在 C 风格数组与 C++ STL 容器之间转换数据时,std::copy 提供了无缝的桥梁。
    适合从旧代码迁移或与外部库接口时使用。
  • 2.通用语法:
std::copy(array, array + size, container.begin());
std::copy(container.begin(), container.end(), array);

  • 3.用法实例
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    int arr[] = {10, 20, 30, 40};
    std::vector<int> vec(4);

    // 数组 → 容器
    std::copy(arr, arr + 4, vec.begin());

    for (int n : vec) std::cout << n << " ";
    // 输出: 10 20 30 40

    // 容器 → 数组
    int new_arr[4];
    std::copy(vec.begin(), vec.end(), new_arr);

    for (int n : new_arr) std::cout << n << " ";
    // 输出: 10 20 30 40

    return 0;
}

无需手动写循环,std::copy 统一了不同数据结构之间的拷贝行为。
兼容原生数组、标准容器和原始指针。

🐓3.3 配合std::back_inserter自动扩展目标容器

  • 1.应用场景:
    当目标容器为空,或不确定大小时,std::copy 可结合 std::back_inserter 自动插入元素,无需提前分配空间。
    适用于复制到空容器、动态拼接内容等情形。
  • 2.通用语法:
std::copy(src_begin, src_end, std::back_inserter(dest));

  • 3.用法实例
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main() {
    std::vector<int> src = {5, 6, 7};
    std::vector<int> dest;

    std::copy(src.begin(), src.end(), std::back_inserter(dest));

    for (int n : dest) std::cout << n << " ";
    // 输出: 5 6 7

    return 0;
}

std::back_inserter 会自动调用 push_back 将元素追加到目标容器末尾。
特别适用于空容器或大小未知的目标容器。
还能与其他算法(如 std::transform, std::unique_copy)配合使用。

🐓3.4 用法总结

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值