要学会使用迭代器和容器以及算法,需要学习下面的新技术。

一、流和迭代器

本书的很多例子程序使用I/O流语句来读写数据。例如:

 int value;
cout << "Enter value: ";
cin >> value;
cout << "You entered " << value << endl;

对于迭代器,有另一种方法使用流和标准函数。理解的要点是将输入/输出流作为容器看待。因此,任何接受迭代器参数的算法都可以和流一起工作。

 //outstrm.cpp
#include <iostream>
#include <cstdlib> // Need rand(), srand()
#include <ctime> // Need time()
#include <algorithm> // Need sort(), copy()
#include <vector> // Need vector
#include <iterator> // 坑爹的教程!!,Need for ostream_iterator
using namespace std; void Display(vector<int>& v, const char* s); int main()
{
// Seed the random number generator
srand( time(NULL) ); // Construct vector and fill with random integer values
vector<int> collection(); for (int i = ; i < ; i++)
{
collection[i] = rand() % ;
} // Display, sort, and redisplay
Display(collection, "Before sorting");
sort(collection.begin(), collection.end());
Display(collection, "After sorting");
return ;
} // Display label s and contents of integer vector v
void Display(vector<int>& v, const char* s)
{
cout << endl << s << endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\t"));
cout << endl;
}

函数Display()显示了如何使用一个输出流迭代器。下面的语句将容器中的值传输到cout输出流对象中:

copy(v.begin(), v.end(),ostream_iterator<int>(cout, "\t"));

第三个参数实例化了ostream_iterator<int>类型,并将它作为copy()函数的输出目标迭代器对象。“\t”字符串是作为分隔符。

这是STL神奇的一面『确实神奇』。为定义输出流迭代器,STL提供了模板类ostream_iterator。这个类的构造函数有两个参数:一个ostream对象和一个string值。

因此可以象下面一样简单地创建一个迭代器对象:

ostream_iterator<int>(cout, "\n")

该迭代器可以和任何接受一个输出迭代器的函数一起使用。

二、插入迭代器

插入迭代器用于将值插入到容器中。它们也叫做适配器,因为它们将容器适配或转化为一个迭代器,并用于copy()这样的算法中。例如,一个程序定义了一个链表和一个矢量容器:

list<double> dList;

vector<double> dVector;

通过使用front_inserter迭代器对象,可以只用单个copy()语句就完成将矢量中的对象插入到链表前端的操作:

copy(dVector.begin(), dVector.end(), front_inserter(dList));

三种插入迭代器如下:

  • inserter 将对象插入到容器任何对象的前面。
  • front_inserter 将对象插入到数据集的前面——例如,链表表头。
  • back_inserter 将对象插入到集合的尾部——例如,矢量的尾部,导致矢量容器扩展。

使用插入迭代器可能导致容器中的其他对象移动位置,因而使得现存的迭代器非法。例如,将一个对象插入到矢量容器将导致其他值移动位置以腾出空间。一般来说,插入到象链表这样的结构中更为有效,因为它们不会导致其他对象移动。

 #include <iostream>
#include <algorithm>
#include <list>
#include <iterator> using namespace std; int iArray[] = { , , , , }; void Display(list<int>& v, const char* s); int main()
{
list<int> iList; // Copy iArray backwards into iList copy(iArray, iArray + , front_inserter(iList)); //5 4 3 2 1
//copy(iArray, iArray + 5, inserter(iList, iList.begin())); //1 2 3 4 5
//copy(iArray, iArray + 5, back_inserter(iList)); //1 2 3 4 5 Display(iList, "Before find and copy"); // Locate value 3 in iList
list<int>::iterator p = find(iList.begin(), iList.end(), ); // Copy first two iArray values to iList ahead of p
copy(iArray, iArray + , inserter(iList, p)); //插入1 2到3的前面
Display(iList, "After find and copy"); return ;
} void Display(list<int>& a, const char* s)
{
cout << s << endl;
copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}

使用front_inserter插入到链表的前端的时候,数据会倒过来- -

使用普通插入器inserter指定插入到链表前端和使用back_inserter数据都是按照原顺序输出的。。

三、混合迭代器函数

在涉及到容器和算法的操作中,还有两个迭代器函数非常有用:

  • advance() 按指定的数目增减迭代器。
  • distance() 返回到达一个迭代器所需(递增)操作的数目。
 #include <iostream>
#include <algorithm>
#include <list>
using namespace std; int iArray[] = { , , , , }; int main()
{
list<int> iList; copy(iArray, iArray + , inserter(iList, iList.begin())); //1 2 3 4 5 list<int>::iterator p =find(iList.begin(), iList.end(), ); cout << "before: p == " << *p << endl;
advance(p, ); // same as p = p + 2; 向后移动3位
cout << "after : p == " << *p << endl; int k = distance(p, iList.end()); //起始位置在前,终止位置在后
cout << "k == " << k << endl; k = distance(p, iList.begin()); //2 STL中list是双向循环链表
cout << "k == " << k << endl; k = distance(iList.begin(), p); //4
cout << "k == " << k << endl; //begin指向第一个位置,end指向最后一个位置的后一个位置
//cout << *iList.begin() << endl;
//cout << *iList.end() << endl;
return ;
}

advance()函数接受两个参数。第二个参数是向前推进的数目。对于前推迭代器,该值必须为正,而对于双向迭代器和随机访问迭代器,该值可以为负。

(这不是往后推进的吗?呃。。。不知道作者有没有搞错- -以上是作者原话)

使用 distance()函数来返回到达另一个迭代器所需要的步骤。

前者到后者的步数

STL_iterator迭代器(2)——几种迭代器对象的用法的更多相关文章

  1. python学习 day13 迭代器,生成器,枚举对象

    一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...

  2. 理解迭代器,生成器,yield,可迭代对象

    原文:https://foofish.net/iterators-vs-generators.html 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Gen ...

  3. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  4. day13 十三、迭代器、生成器、枚举对象

    def my_generator(): print(1111) yield '结果1' print(2222) yield '结果2' print(3333) yield '结果3' print(44 ...

  5. python - 迭代器(迭代协议/可迭代对象)

    迭代器 # 迭代器协议 # 迭代协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发一个 StopIteration 异常,以终止迭代(只能往后走不能往前退) # 可迭代对 ...

  6. C++五种迭代器之间的关系

    迭代器操作                      说明(1)所有迭代器p++                              后置自增迭代器++p                     ...

  7. C++ Iterator迭代器介绍及Iterator迭代器用法代码举例

    C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代 ...

  8. javascript中15种原生对象类型系统综述

    前面的话 在编程语言中,能够表示并操作的值的类型称做数据类型,编程语言最基本的特性就是能够支持多种数据类型.javascript拥有强大的类型系统,主要包括原生对象.宿主对象和浏览器拓展对象,本文主要 ...

  9. db4o种纯对象数据库引擎

    db4o是一种纯对象数据库,相对于传统的关系数据库+ORM,db4o具有以下好处:1)以存对象的方式存取数据(废话--,不过你考虑一下完全以对象的方式去考虑数据的存取对传统的数据库设计思维来说是多么大 ...

随机推荐

  1. C++面试中string类的一种正确写法

    C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...

  2. iOS开发系列之运动事件

    前面我们主要介绍了触摸事件以及由触摸事件引出的手势识别,下面我们简单介绍一下运动事件.在iOS中和运动相关的有三个事件:开始运动.结束运动.取消运动. 监听运动事件对于UI控件有个前提就是监听对象必须 ...

  3. 化繁为简,无需后端。巧用Yql+rss,搭建我的个人网站

    [本文含有大量的心理描写,没耐心的看官直接跳转到末尾即可] 前言: 最近做好了个人网站.很多人都喜欢用WordPress弄一个自己的博客之类的,但其实我觉得没这个必要,Lofter的功能.界面神马的于 ...

  4. GridView禁止上下滚动的方法

    通常情况下,我们使用GridView来完成类似表格的布局,这种布局,我们只需要设置列数,会自动根据适配器的数据进行适配,非常灵活. GridView其实就是一个容器.允许向其内部添加控件,通常情况下, ...

  5. U口破解指令介绍.

  6. centos7 部署ssserver

    centos7 部署shadowsocks服务端 为什么要选centos7? 以后centos7 肯定是主流,在不重要的环境还是尽量使用新系统吧 centos7 的坑 默认可能会有firewall 或 ...

  7. oracle 自治事物 -- autonomous transaction

    一 使用规则 : 在begin 之前申明  : PRAGMA AUTONOMOUS_TRANSACTION; 二 使用理解:autonomous transaction 是一个独立的事务,这一点是理解 ...

  8. 简单html以及css的用法

    我将利用三天的时间来完成制作京东首页的静态页面效果,其中包含的内容有html以及css. 1.在开发进行之前,首先要配置开发环境:我们需要安装sublime  webstorm  vscode  Hb ...

  9. phpmyadmin安装出错,缺少 mysqli 扩展。请检查 PHP 配置

    下载了个phpmyadmin最新版本的,始终显示这样的内容,求助.如何解决哈?>缺少 mysqli 扩展.请检查 PHP 配置. <a href="Documentation.h ...

  10. 知识点总结之HTML篇

    1.标签语义化: ①.在不依赖样式的情况下,页面能够呈现清晰的结构. ②.如果使用者有视觉障碍,屏幕阅读器会完全根据你的标记来选择读取你的网页. ③.有利于搜索引擎依赖于标记来确定上下文和各个关键字的 ...