

新闻资讯
技术学院std::back_inserter 是包装 push_back() 的迭代器适配器,不存储数据,需配合可增长容器使用,依赖目标容器已存在且非常量,仅支持单向写入。
它不存储数据,也不管理内存,只是把 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::vectordst; std::copy(src.begin(), src.end(), std::back_inserter(dst));
std::copy(src.begin(), src.end(), std::back_inserter(std::vector())); // 临时对象,引用绑定失败
const std::vectordst; std::copy(src.begin(), src.end(), std::back_inserter(dst)); // const 容器无 push_back
用 dst.begin() 要求 dst 已有足够空间,否则越界写入(未定义行为);而 std::back_inserter(dst) 自动调用 push_back(),边插边扩容。
典型对比场景:
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,就会不断累积,而不是清空重来。