C++迭代器发生器

一、迭代器发生器

头文件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,尝试在当前插入位置插入一个元素并赋值。这有效地将容器扩展一个元素。

返回的迭代器支持输出迭代器的所有其他典型操作但不起作用:分配的所有值都插入到当前插入位置 - 这是在调用此函数之后,并且在每次新插入后由迭代器赋值引起的递增。

参数

  1. x
    迭代器将在其上插入新元素的容器。
    Container应该是一个定义了成员插入的容器类。
  2. 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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/baidu_34884208/article/details/88366466