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 = inserter(iVec, it); //it必须是一个指向iVec的迭代器,
iter = value; //将value插入到it之前
习题 10.28 三种插入迭代器的应用
int main()
{
int array[] = { ,,,,, };
vector<int> iVec(begin(array), end(array));
vector<int> iVec_back;
deque<int> iDeque_front;
list<int> iList_inserter; copy(iVec.begin(), iVec.end(), back_inserter(iVec_back));
copy(iVec.begin(), iVec.end(), front_inserter(iDeque_front));
copy(iVec.begin(), iVec.end(), inserter(iList_inserter, iList_inserter.begin())); system("pause");
}
习题10.27
int main()
{
int array[] = { -, , , , , -, , -, };
vector<int> iVec(begin(array), end(array));
vector<int> iVecUnique;
//元素排序,为拷贝不重复的元素做准备
stable_sort(iVec.begin(), iVec.end());
//拷贝不重复的元素到iVecUnique
unique_copy(iVec.begin(), iVec.end(), back_inserter(iVecUnique)); system("pause");
}
10.4.2 iostream迭代器
主要目的是使用算法操作流迭代器。
习题10.30 标准流迭代器的应用
int main()
{
istream_iterator<int> in_ite(cin); //定义输入流迭代器,并绑定标准输入流
istream_iterator<int> in_end; //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器
ostream_iterator<int> out_iter(cout); //定义输出流迭代器,并绑定标准输出流
vector<int> iVec;
copy(in_ite, in_end, back_inserter(iVec));
sort(iVec.begin(), iVec.end());//排序
copy(iVec.begin(), iVec.end(), out_iter);//输出到与 out_iter 绑定的标准输出设备
system("pause");
}
习题 10.29 使用流迭代器读取文件
int main()
{
ifstream ifstrm("h:\\1.txt"); //定义文件输入流
istream_iterator<string> in_iter(ifstrm); //定义IO类的输入迭代器,并绑定ifstrm
istream_iterator<string> in_end; //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器
vector<string> strVec;
copy(in_iter, in_end, back_inserter(strVec)); //利用copy算法将文件中的内容放到容器,以单词为组 system("pause");
}
10.4.3反向迭代器
//假定有一个名为 line 的string,保存着一个逗号分隔的单词列表,我们希望打印line中的第一个单词和最后一个单词,则分别用正向迭代器和逆向迭代器
int main()
{
string line = "first,middle,last";
auto comma = find(line.cbegin(), line.cend(), ','); //查找第一个逗号
cout << string(line.cbegin(), comma) << endl; //打印最后一个单词
auto rcomma = find(line.crbegin(), line.crend(), ','); //查找最后一个逗号
cout << string(line.crbegin(), rcomma) << endl; //错误,输出 tsal 是逆序的
//cout << string(rcomma, line.crbegin()) << endl; //错误,rcomma是一个逆向迭代器,而line.crbegin()返回尾后字符,所以会溢出
cout << string(rcomma.base(), line.end()) << endl; //正确,反向迭代器调用base()函数会返回普通迭代器,注意调用后指向不同的元素,会移动一位
system("pause");
}
10.4 再探迭代器-插入/IO/反向的更多相关文章
- 【C++ Primer | 10】再探迭代器
插入迭代器 1. 测试代码: #include<iostream> #include<vector> #include<list> #include<iter ...
- 【C++ Primer 第10章】再探迭代器
反向迭代器 • 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器.对于反向迭代器,递增(以及递减)操作的含义会颠倒过来. • 递增一个反向迭代器(++it)会移动到前一个元素:递减一迭代器(-- ...
- C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法
除了为每个容器定义的迭代器之外,标准库在头文件<iterator>还定义了额外集中迭代器, 包括: 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 流迭代器, 这些迭 ...
- c++再探string之eager-copy、COW和SSO方案
在牛客网上看到一题字符串拷贝相关的题目,深入挖掘了下才发现原来C++中string的实现还是有好几种优化方法的. 原始题目是这样的: 关于代码输出正确的结果是()(Linux g++ 环境下编译运行) ...
- 再探jQuery
再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
随机推荐
- AOSP中的HLS协议解析
[时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, AOSP, 源码分析,HttpLiveSource, LiveSession,PlaylistFetcher] ...
- Protocol Buffers学习教程
最近看公司代码的过程中,看到了很多proto后缀的文件,这是个啥玩意?问了大佬,原来这是Protocol Buffers! 这玩意是干啥的?查完资料才知道,又是谷歌大佬推的开源组件,这玩意完全可以取代 ...
- EntityFramework 动态构造排序 Func<IQueryable<T>, IOrderedQueryable<T>> Dynamic
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...
- 【数据库】——SQLite使用drop column删除表字段
由于项目需求变更,我需要在sqlite的表中删除一个字段,通用的sql操作语句如下: alter table task drop column custom_fields; 结果数据库提示如下错误: ...
- android9.0适配HTTPS:not permitted by network security policy'
app功能接口正常,其他手机运行OK,但是在Android9.0的手机上报错 CLEARTEXT communication to 192.168.1.xx not permitted by netw ...
- YII2 使用phpexcel(干货)
参考:http://www.cnblogs.com/xiaocongjiejie/p/5106249.html http://www.cnblogs.com/xiaocongjiejie/p/5106 ...
- 深入理解String类详解
1.Stringstr = "eee" 和String str = new String("eee")的区别 先看一小段代码, 1 public static ...
- 手写一个selenium浏览器池
维护一组浏览器,实现每分钟1000次查询.DriverPool使用变幻版只初始化一次的单例模式.维护每个浏览器的当前是否使用的状态. 不需要等待请求来了,临时开浏览器,开一个浏览器会耽误6秒钟. 可以 ...
- 1开放封闭原则OCP
一.什么是开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体 应当对扩展开放,则修改关闭. 在设计一个模块时,应当使得这个模块可以在不被修 改的前提下被扩展.也就是 ...
- TIJ -- 任务间使用管道进行输入/输出
1. 通过输入/输出在线程间进行通信通常很有用.提供线程功能的类库以“管道”的形式对线程间的输入/输出提供了支持.它们在Java输入/输出类库中的对应物就是PipedWriter类(允许任务向管道写) ...