# std::inserter

< cpp‎ | iterator

定义于头文件 `<iterator>` |  |
template< class Container > std::insert_iterator<Container> inserter( Container& c, typename Container::iterator i ); |  | (C++20 前)
template< class Container > constexpr std::insert_iterator<Container> inserter( Container& c, ranges::iterator_t<Container> i ); |  | (C++20 起)

`inserter` 是为容器 `c` 与其迭代器 `i` 构造 std::insert_iterator 的便利函数模板，拥有从参数类型推导的类型。

### 参数

c | - | 支持 `insert` 操作的容器
i | - | 指示插入位置的 `c` 中迭代器

### 返回值

能用于在 `i` 所指示位置插入元素到容器 `c` 的 std::insert_iterator 。

### 可能的实现

    template< class Container >
    std::insert_iterator<Container> inserter( Container& c, typename Container::iterator i )
    {
        return std::insert_iterator<Container>(c, i);
    }

### 示例

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <vector>
    #include <set>

    int main()
    {

        std::multiset<int> s {1, 2, 3};

        // std::inserter 常用于 set
        std::fill_n(std::inserter(s, s.end()), 5, 2);

        for (int n : s)
            std::cout << n << ' ';
        std::cout << '\n';

        std::vector<int> d {100, 200, 300};
        std::vector<int> l {1, 2, 3, 4, 5};

        // 插入顺序容器是，插入点前进，因为每次
        // std::insert_iterator::operator= 都更新目标迭代器
        std::copy(d.begin(), d.end(), std::inserter(l, std::next(l.begin())));

        for (int n : l)
            std::cout << n << ' ';
        std::cout << '\n';
    }

输出：

    1 2 2 2 2 2 2 3
    1 100 200 300 2 3 4 5

### 参阅

insert_iterator | 用于插入容器的迭代器适配器 (类模板)
back_inserter | 创建拥有从实参推出的类型的 std::back_insert_iterator (函数模板)
front_inserter | 创建拥有从实参推出的类型的 std::front_insert_iterator (函数模板)