Bootstrap

C++ - 插入迭代器(Iterator Inserter)

参考:

  1. 《Essential C++》
  2. CSDN - C++迭代器之’插入迭代器’

一、概述

插入迭代器(Insert Iterator),又叫插入器(Inserter)。插入迭代器的主要功能为把一个赋值操作转换为把相应的值插入容器的操作。插入迭代器对标准算法库而言尤其重要。算法库对所有在容器上的操作有个承诺:决不修改容器的大小(不插入、不删除)。有了插入迭代器,既使得算法库可以通过迭代器对容器插入新的元素,又不违反这一承诺,即保持了设计上的一致性

二、使用样例

插入迭代器分为三种类型:尾部插入器(back_insert),首部插入器(front_insert)和普通插入器(insert)

#include <iterator>

PrintElements():

template <typename ElemType>
void PrintElements(ElemType first, ElemType last, string s)
{
    cout << s << ": ";
    while (first != last)
        cout << *first++ << " ";
    cout << endl;
}

2.1 back_inserter()

back_inserter()会以容器的push_back()函数取代assignment(赋值)运算符。对vector来说,这是比较合适的inserter。传入back_inserter的参数,应该就是容器本身:

    vector<int> vec = {1, 1, 2, 2, 3};
    vector<int> vec2 = {8, 8, 8};
    unique_copy(vec.begin(), vec.end(), back_inserter(vec2));
    PrintElements(vec2.begin(), vec2.end(), "vec2");

输出结果:

vec2: 8 8 8 1 2 3 

2.2 inserter()

inserter()会以容器的inser()函数取代assignment运算符。inserter()接受两个参数:一个是容器,另一个是iterator,指向容器内的插入操作起点。

vector<int> vec = {1, 1, 2, 2, 3};
vector<int> vec2 = {8, 8, 8};
unique_copy(vec.begin(), vec.end(), inserter(vec2, vec2.begin()+1));
PrintElements(vec2.begin(), vec2.end(), "vec2");

输出结果:

vec2: 8 1 2 3 8 8

2.3 front_inserter()

front_inserter()会以容器的push_front()函数取代assignment运算符。这个inserter只适用于list与deque:

list<int> lis = {1,2,3};
list<int> lis2 = {8,8,8};
copy(lis.begin(), lis.end(), front_inserter(lis2));
PrintElements(lis2.begin(), lis2.end(), "lis2");

输出结果:

lis2: 3 2 1 8 8 8 
;