一、迭代器发生器
头文件iterator
template <class Container>
back_insert_iterator<Container> back_inserter (Container& x);
构造后插入迭代器
构造一个后插入迭代器,在x的末尾插入新元素。
back-insert迭代器是一种特殊类型的输出迭代器,旨在允许通常覆盖元素(例如复制)的算法在容器的末尾自动插入新元素。
x的类型需要有一个push_back成员函数(例如标准容器向量,双端队列和列表)。
在返回的迭代器上使用赋值运算符(取消引用或不引用),使容器扩展一个元素,该元素初始化为指定的值。
返回的迭代器支持输出迭代器的所有其他典型操作,但不起作用:分配的所有值都插入容器的末尾。
参数
- x
迭代器将在其上插入新元素的容器。
Container应该是一个定义了成员push_back的容器类。
返回值
一个back_insert_iterator,它在容器x的末尾插入元素。
// back_inserter example
#include <iostream> // std::cout
#include <iterator> // std::back_inserter
#include <vector> // std::vector
#include <algorithm> // std::copy
int main () {
std::vector<int> foo,bar;
for (int i=1; i<=5; i++)
{ foo.push_back(i); bar.push_back(i*10); }
std::copy (bar.begin(),bar.end(),back_inserter(foo));
std::cout << "foo contains:";
for ( std::vector<int>::iterator it = foo.begin(); it!= foo.end(); ++it )
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
数据范围
除了获取对它的引用之外,调用不访问容器(x),但是返回的对象可以用于访问或修改它。
异常
除了x在应用一元运算符时以某种方式抛出它,此函数永远不会抛出异常(无抛出保证)。
二、front_inserter
头文件iterator
template <class Container>
front_insert_iterator<Container> front_inserter (Container& x);
构造前插入迭代器
构造一个前插入迭代器,在x的开头插入新元素。
前插入迭代器是一种特殊类型的输出迭代器,旨在允许通常覆盖元素(例如复制)的算法在容器的开头自动插入新元素。
x的类型需要具有push_front成员函数(例如标准容器deque和list)。
在返回的迭代器上使用赋值运算符(取消引用或不引用),使容器扩展一个元素,该元素初始化为指定的值。
返回的迭代器支持输出迭代器的所有其他典型操作,但不起作用:分配的所有值都插入容器的开头。
参数
- x
迭代器将在其上插入新元素的容器。
Container应该是一个定义了成员push_front的容器类。
返回值
front_insert_iterator,它在容器x的末尾插入元素。
// front_inserter example
#include <iostream> // std::cout
#include <iterator> // std::front_inserter
#include <deque> // std::deque
#include <algorithm> // std::copy
int main () {
std::deque<int> foo,bar;
for (int i=1; i<=5; i++)
{ foo.push_back(i); bar.push_back(i*10); }
std::copy (bar.begin(),bar.end(),std::front_inserter(foo));
std::cout << "foo contains:";
for ( std::deque<int>::iterator it = foo.begin(); it!= foo.end(); ++it )
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
数据范围
除了获取对它的引用之外,调用不访问容器(x),但是返回的对象可以用于访问或修改it。
异常
除了x在应用一元运算符时以某种方式抛出it,此函数永远不会抛出异常(无抛出保证)。
三、inserter
头文件iterator
【C++11】
template <class Container>
insert_iterator<Container> inserter (Container& x, typename Container::iterator it);
构造插入迭代器
构造一个插入迭代器,它将新元素插入到从其指向的位置开始的连续位置的x中。
插入迭代器是一种特殊类型的输出迭代器,旨在允许通常覆盖元素(例如复制)的算法自动在容器中的特定位置插入新元素。
x的类型需要具有插入成员函数(例如大多数标准容器)。
在返回的迭代器上使用赋值运算符(取消引用或不引用)会导致在容器上调用insert,尝试在当前插入位置插入一个元素并赋值。这有效地将容器扩展一个元素。
返回的迭代器支持输出迭代器的所有其他典型操作但不起作用:分配的所有值都插入到当前插入位置 - 这是在调用此函数之后,并且在每次新插入后由迭代器赋值引起的递增。
参数
- x
迭代器将在其上插入新元素的容器。
Container应该是一个定义了成员插入的容器类。 - it
迭代器指向插入点。
这应该是一个可变的迭代器(不是const迭代器)。
返回值
insert_iterator,用于将元素插入x所指示的位置。
// inserter example
#include <iostream> // std::cout
#include <iterator> // std::front_inserter
#include <list> // std::list
#include <algorithm> // std::copy
int main () {
std::list<int> foo,bar;
for (int i=1; i<=5; i++)
{ foo.push_back(i); bar.push_back(i*10); }
std::list<int>::iterator it = foo.begin();
advance (it,3);
std::copy (bar.begin(),bar.end(),std::inserter(foo,it));
std::cout << "foo contains:";
for ( std::list<int>::iterator it = foo.begin(); it!= foo.end(); ++it )
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
数据范围
除了获取对它的引用之外,调用不访问容器(x),但是返回的对象可以用于访问或修改it。
异常
提供与取消引用x并复制it相同级别的保证。
四、make_move_iterator
头文件iterator
【C++11】
template <class Iterator>
move_iterator<Iterator> make_move_iterator (const Iterator& it);
构造移动迭代器
从中构造一个move_iterator对象,
move_iterator是一个迭代器适配器,它适配迭代器(it),以便取消引用它产生右值引用(就好像应用了std :: move),而所有其他操作的行为相同。
参数
- it
迭代器。
Iterator是任何类型的输入迭代器。
返回值
一个与之相当的move_iterator,但是会在取消引用时移动。
// make_move_iterator example
#include <iostream> // std::cout
#include <iterator> // std::make_move_iterator
#include <vector> // std::vector
#include <string> // std::string
#include <algorithm> // std::copy
int main () {
std::vector<std::string> foo (3);
std::vector<std::string> bar {"one","two","three"};
std::copy ( make_move_iterator(bar.begin()),
make_move_iterator(bar.end()),
foo.begin() );
// bar now contains unspecified values; clear it:
bar.clear();
std::cout << "foo:";
for (std::string& x : foo) std::cout << ' ' << x;
std::cout << '\n';
return 0;
}