简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者
新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

🍉🍉🍉文章目录🍉🍉🍉
🌻1.前言
本篇目的:C++进阶之迭代器复制std::copy:用法实例
🌻2. C++迭代器复制std::copy介绍
-
基本概念
std::copy是 C++ 标准库中的通用算法,定义于<algorithm>头文件中,其作用是将一个范围内的元素复制到另一个位置。它是 STL 中最基础且常用的数据移动算法之一,常用于将数组、容器或迭代器范围内的数据转移到新位置或新容器中。 -
功能
该函数接受三个参数:起始迭代器、结束迭代器和目标迭代器。它从源范围[first, last)中依次复制元素到从目标位置d_first开始的区域,直到源范围的所有元素被复制完毕。返回值是指向目标区域中最后一个被复制元素之后的位置。 -
迭代器要求
源范围的两个迭代器first和last必须至少为输入迭代器,能够进行只读访问;目标迭代器d_first必须为输出迭代器,能够写入数据。这种设计保证了std::copy可以应用于多种不同的迭代器类型,包括指针和容器迭代器。 -
元素复制方式
元素的复制是通过赋值操作*d_first = *first完成的,因此所操作的对象类型必须是可赋值的。如果对象类型存在拷贝构造函数或拷贝赋值运算符,std::copy将按值复制对象。如果对象不可拷贝,该算法将无法使用并在编译时报错。 -
性能特性
std::copy的时间复杂度为线性,即 O(n),其中 n 是被复制元素的数量。对于随机访问迭代器,如数组或std::vector的迭代器,算法可以进行指针加法优化以提高效率。对于链表等不支持随机访问的容器,它会逐个处理元素。 -
使用限制
源范围和目标范围不应重叠,否则将导致未定义行为。在存在重叠的情况下,应该使用std::copy_backward以保证复制顺序的正确性。此外,目标范围必须有足够的空间来容纳所有被复制的元素,否则可能引发越界写入错误。 -
使用场景
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 用法总结

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

被折叠的 条评论
为什么被折叠?



