std::copy复制指定范围所有元素,需预先分配目标空间或使用std::back_inserter;std::copy_if按条件复制,接受谓词函数,常结合std::back_inserter动态添加元素,二者均返回指向末尾的迭代器。

在C++中,std::copy 和 std::copy_if 是定义在 algorithm 头文件中的两个非常实用的算法函数,用于从一个容器复制元素到另一个容器。它们支持按条件或无条件拷贝,适用于各种标准容器(如 vector、list、array 等)。
std::copy:复制指定范围的所有元素
std::copy 用于将一个范围内的所有元素复制到目标位置。它需要三个参数:源范围的起始和结束迭代器,以及目标容器的起始写入位置。
目标容器需要预先分配足够的空间,否则可能导致未定义行为。
示例代码:
#include#include #include int main() { std::vector src = {1, 2, 3, 4, 5}; std::vector dst(src.size()); // 必须提前分配空间 std::copy(src.begin(), src.end(), dst.begin()); for (int x : dst) { std::cout << x << " "; } // 输出:1 2 3 4 5 }
也可以结合 std::back_inserter 避免手动分配空间:
立即学习“C++免费学习笔记(深入)”;
std::vectordst; // 空容器 std::copy(src.begin(), src.end(), std::back_inserter(dst));
std::copy_if:按条件复制元素
std::copy_if 在复制时加入条件判断,只复制满足条件的元素。它比 std::copy 多一个谓词(predicate)参数,通常是一个 lambda 表达式或函数对象。
示例:复制所有偶数
#include#include #include int main() { std::vector src = {1, 2, 3, 4, 5, 6}; std::vector even; std::copy_if(src.begin(), src.end(), std::back_inserter(even), [](int n) { return n % 2 == 0; }); for (int x : even) { std::cout << x << " "; } // 输出:2 4 6 }
你可以自定义任意条件,比如复制大于10的数、字符串长度超过5的元素等。
使用要点与注意事项
使用这两个函数时需注意以下几点:
- 目标容器若使用 begin() 或 data() 写入,必须确保空间足够;否则使用 std::back_inserter 动态追加。
- std::back_inserter 需要容器支持 push_back() 操作(如 vector、list)。
- 谓词函数在 copy_if 中应返回 bool 值。
- 两个函数都返回一个迭代器,指向复制结束后的下一个位置,可用于获取结果长度。
基本上就这些。合理使用 std::copy 和 std::copy_if 能让代码更简洁、更易读,避免手动写循环带来的错误。关键是提前处理好目标容器的容量问题。










