STL之再探迭代器

插入迭代器

迭代器被绑定到一个容器上,可用来向容器插入元素。
back_inserter创建一个使用push_back的迭代器
front_inserter创建一个使用push_front的迭代器
inserter创建一个使用insert的迭代器,此函数接受哦第二个参数,这个参数必须是指向一个给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前。

list<int> lst = {1,2,3,4};
list<int> lst1, lst2; //空list
//拷贝完成之后,lst1包含4 3 2 1
copy(lst.begin(), lst.end(), front_inserter(lst1));
//拷贝完成之后,lst2包含1 2 3 4
//inserter和back_inserter不会使插入元素序列颠倒
copy(lst.begin(), lst.end(),inserter(lst2,lst2.begin()));

流迭代器

istream_iterator操作

迭代器被绑定到输入或输出流上,可用来遍历所关联的IO流。使用需要包含<iterator>

ifstream in("afile");
istream_iterator<string> str_it(in); //从"afile"读取数据

istream_iterator<int> in_iter(cin); //从cin读取int
istream_iterator<int> eof //默认初始化,生成istream尾后迭代器
while (in_iter != eof)
{
    vec.push_back(*in_iter++);
}

更妙的用法:

istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;
vector<int> vec(in_iter, eof);

这个构造函数从cin中读取数据,直到遇到文件尾或者遇到一个不是int的数据为止。从流中读取的数据被用来构造vec。

ostream_iterator操作

两种构造函数:

//out将类型为T的值写入到输出流os中
ostream_iterator<T> out(os);
//out将类型为T的值写入到输出流os中,每个值后面都输出一个d
ostream_iterator<T> out(os, d);

使用ostream_iterator输出值的序列的三种方式:

ostream_iterator<int> out_iter(cout, " ");
for (auto& e : vec)
{
    *out_iter++ = e;
}
cout<<endl;

ostream_iterator<int> out_iter(cout, " ");
for (auto& e : vec)
{
    out_iter = e;
}
cout<<endl;

ostream_iterator<int> out_iter(cout, " ");
copy(vec.begin(), vec.end(), out_iter);

练习题
编写程序,接受三个参数,一个输入文件和两个输出文件的文件名。输入文件保存整数。使用istream_iterator读取输入文件,使用ostream_iterator将奇数写入第一个输出文件,每个值后面都跟一个空格;将偶数写入第二个输出文件,每个值都独占一行。

解题代码

//#include <iostream>
#include <fstream>
#include <iterator>

using namespace std;
int pro(const char* ch1, const char* ch2, const char* ch3);
int main()
{
    pro("in.txt", "out1.txt", "out2.txt");
}

int pro(const char* ch1, const char* ch2, const char* ch3)
{
    ifstream in(ch1);
    ofstream out1(ch2);
    ofstream out2(ch3);
    istream_iterator<int> in_iter(in), eof;
    ostream_iterator<int> out_iter1(out1, " ");
    ostream_iterator<int> out_iter2(out2, "\n");
    while (in_iter != eof)
    {
        if (*in_iter & 0x1)
        {
            //*out_iter1 = *in_iter++;
            *out_iter1++ = *in_iter++;
        }
        else
        {
            //*out_iter2 = *in_iter++;
            *out_iter2++ = *in_iter++;
        }
    }
}

反向迭代器

反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器。对于反向迭代器,递增和递减操作的含义会点到过来。除了forward_list之外,其他容器都支持反向迭代器。这些成员函数返回指向容器尾元素和首元素之前一个位置的迭代器。

可以通过向sort传递一对反向迭代器来将vector整理为递减序:

sort(vec.begin(), vec.end()); //正常排序vec,从小到大
sort(vec.rbegin(), vec.rend()); //逆序排序,从大到小

打印string对象中的单词:

string line = "one,two,three";
//输出第一个单词
auto comma = find(line.cbegin(), line.cend(), ',');
cout<<string(line.cbegin(), comma)<<endl;

//输出最后一个单词
auto rcomma = find(line.crbegin(), line.crend(), ',');
cout<<string(rcomma.base(), line.cend())<<endl;

可以调用reverse_iteratorbase成员函数将其转化为普通的迭代器。rcomma和rcomma.base()指向不同的元素,但是它们位置相邻。

移动迭代器

这些专用的迭代器不是拷贝其中的元素,而是移动它们。

转载:http://blog.csdn.net/foreverling/article/details/44245499

时间: 2024-08-22 14:08:03

STL之再探迭代器的相关文章

数据点: 再探System.Transactions

在 Microsoft .NET Framework 中,System.Transactions 命名空间使得事务的处理比采用以往任何 一种技术都要简单.此前,我曾经撰写过一个数据点专栏,介绍了 System.Transactions 在 Microsoft .NET Framework 2.0 Beta 1 以及 SQL Server 2005 下的工作方式.当然,在 产品的发布过程中,既增加了一些功能,也去掉了一些功能:有些 TransactionScopeOptions 已经发生 了变化.

[老老实实学WCF] 第五篇 再探通信--ClientBase

原文:[老老实实学WCF] 第五篇 再探通信--ClientBase 老老实实学WCF 第五篇 再探通信--ClientBase   在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创建了通道,实现了和服务端的通信.然而,与服务端通信的编程模型不只一种,今天我们来学习利用另外一个服务类ClientBase<>来完成同样的工作,了解了这个类的使用方法,我们对服务引用中的关键部分就能够理解了.   Client

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

再探FlashCom的HTTP Tunneling

我以前有文章讲过HTTP Tunneling,最近在自己Server实战,发现一个问题,因为Port 80给Apache用了,岂不是对于Web Server和FlashCom是同一台机器的,无法实现HTTP Tunneling?翻查FlashCom帮助,关于HTTP Tunneling的说明非常少而模煳不清,于是直接看<FlashCom>/conf/_defaultRoot_/Adaptor.xml关于HTTP Port设定部分的註释,反而发现FlashCom可以Bind向多个IP Port,

再探早期示例

为注意到一些利用新事件模型的例子和为学习程序从老到新事件模型改变的方法,下面的例子回到在本章第一部分利用事件模型来证明的一些争议.另外,每个程序包括程序片和应用程序现在都可以借助或不借助浏览器来运行. 1. 文本字段 这个例子同TextField1.java相似,但它增加了显然额外的行为:   //: TextNew.java // Text fields with Java 1.1 events import java.awt.*; import java.awt.event.*; impor

再探Java内存分配

自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 自定义View系列教程08–滑动冲突的产生及其处理

再探创新工场

萌芽新生却争议不断的第一年,刻意低调的李开复和创新工场究竟做了什么?又是否真正能"创新"出一种生产创新的高效模式? □ 文/本刊记者 曹一方 时至晌午,200多个年轻的工友三五成群地聚在一起,有说有笑地吃着午饭.这时,门口传来一阵打招呼的欢快声音--李开复来了,永远的一身黑色正装.一丝不苟的三七分发型,还有儒雅自信的笑容. 2010年9月末,<商界>记者再次见到李开复,是在创新工场位于北京海淀区第三极书局的新家.见到记者,他热情地挥手:"我一直记得你啊,上次那篇报

马云资本棋局再探:约谈中投或是烟雾弹

李立 旷日持久的雅巴之争,以双方协定的股权回购协议暂告一段.对马云(微博)与阿里巴巴(微博)而言,这仅仅是一个开始,如何筹集赎身款项意味着一系列新的选择与利弊权衡.这一次,马云显然会比7年前更加谨慎. 7年前,雅虎以10亿美元加上雅虎中国的全部资产获得阿里巴巴集团39%的股权.如今,经历了漫长的谈判与争夺,雅虎和阿里巴巴集团联合公告,雅虎同意让后者以71亿美元回购20%股权.如今马云的当务之急是如何在短期内解决资金缺口.根据双方回购协议,马云需要在短期筹集此次回购所需的63亿美元现金.加之即将到

房价暴涨后的海南神话不再记者再探海南楼市

7月2日,记者到达三亚的时候,恰逢<海南国际旅游岛建设发展规划纲要(2010―2020)>(以下简称<规划纲要>)正式公布后的第10天,然而和2月中旬本报记者初探海南楼市所不同的是,走在楼盘和二手房中介云集的三亚湾路上,门庭冷落,一些楼盘销售部索性铁将军把门,年初那种连空气中都弥漫着"抢房"热的氛围早已淡去. 年初一天100套,现在一月50套 "已经两个礼拜没有成交了."三亚鸿基房产置业经理李惠说,年初时,差不多是一天一个价,很多外地人抢着买