std::back_inserter 是包装 push_back() 的迭代器适配器,不存储数据,需配合可增长容器使用,依赖目标容器已存在且非常量,仅支持单向写入。

std::back_inserter 本质是适配器,不是容器
它不存储数据,也不管理内存,只是把 push_back() 操作包装成一个“迭代器接口”。算法(比如 std::copy、std::transform)往这个迭代器写入时,实际调用的是目标容器的 push_back()。
常见误用是把它当成能“扩容”的迭代器——其实它完全依赖目标容器自身是否支持 push_back()(如 std::vector、std::deque、std::list 可以;std::array、std::forward_list 不行)。
必须配合可增长容器使用,且目标容器需预先声明
std::back_inserter 接收一个左值引用,所以目标容器必须已存在、可修改。不能传临时对象或 const 容器。
- ✅ 正确:
std::vector
dst; std::copy(src.begin(), src.end(), std::back_inserter(dst)); - ❌ 错误:
std::copy(src.begin(), src.end(), std::back_inserter(std::vector
())); // 临时对象,引用绑定失败 - ❌ 错误:
const std::vector
dst; std::copy(src.begin(), src.end(), std::back_inserter(dst)); // const 容器无 push_back
和普通目标迭代器(如 begin())的行为完全不同
用 dst.begin() 要求 dst 已有足够空间,否则越界写入(未定义行为);而 std::back_inserter(dst) 自动调用 push_back(),边插边扩容。
立即学习“C++免费学习笔记(深入)”;
典型对比场景:
- 想把
src全部追加到已有dst尾部 → 用std::back_inserter(dst) - 想把
src复制进dst的前 N 个位置(覆盖式)→ 用dst.begin(),但要确保dst.size() >= src.size() - 想安全地复制并保证容量 → 先
dst.reserve(dst.size() + src.size()),再用std::back_inserter减少重分配次数
不适用于需要随机访问或反向插入的场景
std::back_inserter 返回的迭代器只支持单向写入(operator= 和 operator++),不支持 --、+=、[] 或比较操作。它甚至没有 base() 成员函数(不像 std::reverse_iterator)。
如果需要在头部插入,得用 std::front_inserter(仅限支持 push_front() 的容器,如 std::deque、std::list);如果需要指定位置插入,应改用 std::insert_iterator 并传入具体插入点迭代器。
最易忽略的一点:它不改变原容器的原有元素顺序或内容,只负责“追加”——但如果你反复对同一容器调用 std::back_inserter,就会不断累积,而不是清空重来。










