C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法
除了为每个容器定义的迭代器之外,标准库在头文件<iterator>还定义了额外集中迭代器, 包括:
- 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素。
- 流迭代器, 这些迭代器被绑定到输入或输出流上,可以遍历所关联的IO流
- 反向迭代器,这些迭代器向后而不是向前移动,除了forward_list之外的标准库容器都有反向迭代器。
- 移动迭代器,这些专用得对得起不是拷贝而是移动其中的元素。
插入迭代器
it = t 在it指定的位置插入值t
*it, ++it, --it
有三种插入迭代器:
- back_inserter 创建一个使用push_back的迭代器。
- front_inserter创建一个使用push_front的迭代器。
- inserter创建一个使用insert的迭代器。此函数接受第二个参数,这个参数必须是一个指向给定容器的迭代器。元素被插入到指定的迭代器所表示的元素之前。
*it = val;
效果和下面的代码一样:
it = c.insert(it, val);
++it; // 递增it使它指向原来的元素
而front_inserter生成迭代器的行为和inserter不一样,front_inserter会将传入的元素逆序插入到容器内:
list<int> lst1 = {1, 2, 3, 4};
list<int> lst2, lst3;
copy(lst.begin(), lst.end(), front_inserter(lst2));
copy(lst.begin(), lst.end(), inserter(lst3, llst3.begin()));
我们如果输出lst2和lst3的内容,则可以看到lst2 = 4, 3, 2, 1 而lst3 = 1, 2, 3, 4
iostream迭代器
1. istream_iterator操作
// 从cin读取string
istream_iterator<string> isiter(cin); // 从 file读取string
ifstream ifs("file");
istream_iterator<string> isiter1(ifs);
我们还可以默认初始化一个流迭代器,这样就创建了一个尅当做尾后值使用的迭代器。
vector<int> vec;
istream_iterator<int> in_iter(cin);
istream_iterator<int> end; // istream_iterator尾后迭代器
while(in_iter != end)
vec.push_back(*in_iter++);
2.ostream_iterator操作
ostream_iterator<int> out(cout, " ");
for (auto const e : vec)
*out ++ = e;
cout << endl;
这个程序会将vec中元素输出,而且元素之间都用" " 隔开。
反向迭代器
vector<int> vec{0, 1, 2, 3, 4, 5};
for (auto riter = vec.rbegin(); riter != vec.rend(), ++riter)
cout << *riter << endl;
我们还可以将一个容器的元素从递增排序变为递减顺序:
// 递增顺序
sort(vec.begin(), vec.end());
// 递减顺序
sort(vec.rbegin(), vec.rend());
从一个string中打印第一个单词,假定string的单词之间都用逗号隔开:
string line{"FIRST", "MIDDLE", "LAST"};
auto comma = find(line.begin(), line.end(), ",");
cout << string(line.cbegin(), comma);
如果希望打印最后一个单词,我们可以使用反向迭代器:
auto rcomma = find(line.rbegin(), line.rend(), ",");
cout << string(line.crbegin(), rcomma);
cout << string(rcomma.base(), line.cend());
find(beg, end, val); // 查找val第一次出现的位置
find_if(beg, end, pred); // 查找第一个使得谓词pred为真的元素
reverse(beg, end); // 反转范围中的元素的顺序
reverse(beg, end, dest); // 将元素按逆序拷贝到dest
//从v中删除奇数元素
remove_if(v.begin(), v.end(), [] (int i) { return i % 2; });
// 将偶数元素从v拷贝到v2,v不变。
remove_copy_if(v.begin(), v.end(), back_inserter(v2), [] (int i) { return i % 2;});
lst.merge(lst2); 将来自lst2的元素合并入lst,lst和lst2都必须是有序的
lst.merge(lst2, comp); 元素将从lst2中删除,在合并之后,lst2变为空,第一个版本使用 < 运算符, 第二个版本使用给定的比较操作 lst.remove(val); 调用erase删除掉与给定值相等或令一元谓词为真的每个元素
lst.remove_if(pred);
lst.reverse(); 反转lst中元素的顺序
lst.sort(); 使用< 或给定比较操作排序元素
lst.sort(comp);
lst.unique(); 调用erase删除用一个值的连续拷贝,第一个版本使用==, 第二个版本使用给定的二元谓词。
lst.unique(pred);
链表类型还定义了splice成员算法
// lst.splice(args)或flst.splice_after(args)
(p, lst2) p是一个指向lst中元素的迭代器,或一个指向flst首前位置的迭代器。
函数将lst2所有元素移动到lst中p之前的位置或是flst中p之后的位置。将元素从lst2中删除,lst2的类型必须与lst或flst相同,且不能是同一个链表 (p, lst2, p2) p2是一个指向lst2中位置的有效迭代器,将p2指向的元素移动到lst中,或将p2之后的元素移动到flst中,lst2可以使与lst或flst相同的链表 (p, lst2, b, e) b和e必须表示lst2中的合法范围,将给定范围中的元素从lst2移动到lst或flst。lst2与lst(或flst)可以是相同的链表,但p不能指向给定范围中的元素
C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法的更多相关文章
- C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法
大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ● find算法,算法接受一对迭代 ...
- C++ Primer : 第十章 : 泛型算法 之 lambda表达式和bind函数
一.lambda表达式 lambda表达式原型: [capture list] (parameter list) -> retrue type { function body } 一个lambd ...
- 【C++ Primer 第10章】再探迭代器
反向迭代器 • 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器.对于反向迭代器,递增(以及递减)操作的含义会颠倒过来. • 递增一个反向迭代器(++it)会移动到前一个元素:递减一迭代器(-- ...
- 【C++ Primer | 10】再探迭代器
插入迭代器 1. 测试代码: #include<iostream> #include<vector> #include<list> #include<iter ...
- 10.4 再探迭代器-插入/IO/反向
10.4.1 插入迭代器 插入迭代器接受一个容器,生成一个迭代器,通过向该迭代器赋值可以实现向容器添加元素 (1)back_inserter: 接受一个参数, 示例: auto iter = back ...
- 【C++ Primer | 10】泛型算法
#include<iostream> #include<algorithm> #include<vector> #include<string> #in ...
- C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】
STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...
- C++Primer 第十章
//1.标准库算法不仅可以应用于容器,还可以应用于内置数组,指针. //2.大多数算法都定义在头文件algorithm中.标准库还在头文件numeric中定义了一组数值泛型算法. //3.算法本身不会 ...
随机推荐
- Ibatis.Net各类的作用说明(三)
一.SqlMapper类 Ibatis中,加载.分析配置以及映射文件是在创建SqlMapper实例的时候进行的,另外对数据库的操作,也是在SqlMapper实例上调用方法来完成.在IBatis外部的程 ...
- poj1274 二分匹配
今天复习二分匹配,A 了一道模板题. 二分匹配需要理解增广路的寻找.用dfs来更新最大匹配.注意一些点:赋初值:愚蠢地把==写成了= ; 然后match的记值;每个点都要重新走一遍. #include ...
- wp8.1 Study13:在WP8.1中分享文件和数据
绪论:不同于windows, 在wp8.1中,如果不止一个程序可以接受其Uri或者文件,shell会提供一个界面让用户选择用哪个程序.而在windows中,用户可以在设置那里设置各种文件和Uri的默认 ...
- win10 用微软账户登录无法访问共享的问题
百度找了一大堆可以解决的,最终最简单的方式(可能是bug): 测试了一下,Win10用微软账户登录的,连局域网共享时,输入用户名的时候,前面加个乱七八糟的域名就可以访问了: 比如: 用户名: ba ...
- Windows Server 2012 R2 设置
一.任务栏左下角启动服务器管理器,然后进行设置.1.登录不显示服务器管理器 2.本地服务器,看到右边的IE增强的安全配置,如图所示,关闭两项内容.这样就关闭了IE增强安全提示框. 3.“工具”菜单,启 ...
- GET,POST——简述
本文主要对GET与POST基本区别进行汇总并掌握. HTTPHTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信.HTTP 的工作方式是客户端与服 ...
- (转)JS中innerHTML,innerText,value
原文:http://holysonll.blog.163.com/blog/static/21413909320134111054352/ JS中innerHTML,innerText,value 2 ...
- 极客DIY:使用树莓派制作一架四轴无人机
如果你想DIY一台属于自己的无人机,那么接下来可以阅读这篇文章,阅读完毕之后也许对你会有启发. 这个项目主要用到的零件主要来自Erle Robotics(一个使用Linux系统的开源四轴飞行器项目). ...
- atomic和nonatomic的区别
1.使用atomic进行修饰的属性,在实现文件中不能重写setter方法和getter方法,不然在编译过程会发生报错. 1.使用nonatomic进行修饰的属性,在实现文件中可以重写setter方法和 ...
- STL源码分析----神奇的 list 的 sort 算法实现
STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序, ...