再探迭代器

插入迭代器

迭代器被绑定到一个容器上,可用来向容器插入元素。

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()指向不同的元素,但是它们位置相邻。

移动迭代器

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

时间: 2024-10-15 17:49:12

再探迭代器的相关文章

【足迹C++primer】33、再探迭代器

再探迭代器 这里有插入迭代器,有流迭代器,反向迭代器,移动迭代器. 插入迭代器 这是一种迭代器适配器,接受一个容器,生成一个迭代器,实现向给定容器添加元素. 插入迭代器有三种类型,差异在于元素插入的位置 back_inserter创建一个使用push_back的迭代器. front_inserter创建一个使用push_front的迭代器. inserter创建一个使用insert的迭代器. void fun1() { list<int> lst={1,2,3,4}; list<int&

10.4 再探迭代器-插入/IO/反向

10.4.1 插入迭代器 插入迭代器接受一个容器,生成一个迭代器,通过向该迭代器赋值可以实现向容器添加元素 (1)back_inserter: 接受一个参数, 示例: auto iter = back_inserter(iVec): iter = value: (2)front_inserter: 接受一个参数, 示例: auto iter = front_inserter(iVec): iter = value: (3)inserter: 接受两个参数,示例:auto iter = inser

【C++ Primer 第10章】再探迭代器

反向迭代器 • 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器.对于反向迭代器,递增(以及递减)操作的含义会颠倒过来. • 递增一个反向迭代器(++it)会移动到前一个元素:递减一迭代器(--it)会移动到下一个元素. • 除了forward_list之外,其他容器都支持反向迭代器.我们可以通过调用rbegin.rcend.crbegin和crend成员函数来获得反向迭代器.这些成员函数返回指向容器尾元素和首元素之前一个位置的迭代器.与普通迭代器一样,反向迭代器也有const和非cons

【C++ Primer | 10】再探迭代器

反向迭代器 1. 测试代码: 1 #include<iostream> 2 #include<vector> 3 #include<iterator> 4 using namespace std; 5 6 int main() 7 { 8 vector<int> vec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 9 for (auto r_iter = vec.crbegin(); r_iter != vec.crend();

再探Linux动态链接 -- 关于动态库的基础知识

  在近一段时间里,由于多次参与相关专业软件Linux运行环境建设,深感有必要将这些知识理一理,供往后参考. 编译时和运行时 纵观程序编译整个过程,细分可分为编译(Compiling,指的是语言到平台相关目标文件这一层次)和链接(Linking,指目标文件到最终形成可执行文件这一层次),这个总的过程可称为编译时:就动态链接而言,还存在一个运行时,即程序在被操作系统加载的过程中,系统将该程序需要的动态库加载至内存到程序开始运行的这一段过程.明确这两个过程在一般linux开发中的地位,以及了解每个"

再探css3

再探css3 我们知道,这几年来智能手机的高速发展使得人们使用移动端上网的时间和人数已经超过了PC端.例如在2015年,就中国电商而言,各电商平台在移动端持续发力,移动端购物占比不断攀升,双11期间,天猫交易额突破912亿元,其中移动端交易额占比68%,京东移动端下单量占比达到74%,其余各大电商平台移动端的支付比例也在60%-80%之间.即移动端在2015年超越PC端,成为网购市场的主流选择.这也使得网页设计师需要更加注重移动端的网页制作,而移动端对于HMTL5和CSS3目前已经支持的非常好了

【再探JNI】

上一次了解了一点JNI,然后不甘心的找到了JNI的官方文档.(官方文档绝对是一个最好的学习资料),百度找出来的一些资料大多数是比较零零碎碎的,不具有系统学习的可能,对于我这样的初学者,先全面的了解一个技术比往一个死角里钻研要好很多.并且百度出来的部分资料估计就是跟我这样的半吊子水平还不到的人的一些心得体会呢.因此,个人建议是看官方文档去全面了解一项技术,然后不理解的地方去再去搜集资料.加上自己的理解和实践,这样会进步的快一点. 好了,闲话少说.进入今天的真题.<再探JNI> (1)什么时候用J

再探 butterfly.js - grunt.js篇(一)

再探 butterfly.js - grunt.js篇(一) 神器 grunt.js 久仰grunt.js的大名,学习grunt.js一直是我todo List的第一位.趁着新春佳节来临之际(打酱油的日子),就来填了这个坑,完了这个心愿. grunt.js的强大,强大在于它拥有很多用途丰富的插件,和不同插件之间的联动实现更牛逼的功能. 这里默认大家已经安装了npm和会用npm install等指令,就不详细讲了.下面讲用到grunt-contrib-watch和grunt-contrib-con

再探jQuery

再探jQuery jQuery是一个JavaScript库,它极大的简化了JavaScript编程,虽然目前网络上有大量开源的JS框架,但是jQuery是目前最流行的JS框架,而且提供了大量的扩展.包括Google.Microsoft.IBM等大公司都在使用jQuery框架,值得注意的是,jQuery团体知道JS咋不同浏览器中存在这大量的兼容性问题,所以jQuery兼容所有主流浏览器,包括Internet Explorer 6! 第一部分:使用方法 那么如何使用jQuery呢?很简单,只需要在j