读书笔记:C++ primer 5th edition--chapter10.泛型算法

part1.概述
1.泛型算法不直接操作容器,而是遍历两个迭代器制定的一个元素范围。
2.迭代器令算法不依赖与容器,但是算法依赖于元素类型的操作。
3.算法不会改变底层容器的大小

part2.初识
1.只读算法。
int sum = accumulate(vec.cbegin(), vec.cend(), 0 );
string sum = accumulate(vec.cbegin(), vec.cend(), string(“") );
2.写容器元素的算法
fill(vec.begin(), vec.end(), 0);//将每个元素置零,or fill_n(dest, n, val);
back_inserter()创建迭代器
usage:
vector<int> vec;
fill_n( back_inserter(vec), 10 , 0 );
拷贝数组:
auto ret = copy (begin(a1), end(a1), a2 );
替换
replace( ilist.begin(), ilist.end(), 0, 42);//replace_copy()
3.重排元素算法
sort(words,begin(), words.end());//unique(),erase()

part3.定制操作
1.向算法传递函数
bool isShoter(const string &s1, const &s2){
     return s1.size() < s2.size();
}
sort(words,begin(), words.end(), isShoter );
2.Lamda,理解为一个未命名的内联函数。不同之处在于可以被定义与函数内部。
形式:[capture list] (parameter list) -> return type {function body}
比如:
[ ](const string &a, const string &b)
{ return a.size() < b.size(); }

stable_sort( word,begin(), word.end(),
[ ](const string &a, const string &b)
{ return a.size() < b.size(); }
  )
分为值捕获,引用捕获,隐世捕获,
用途:对于那种只在一两个地方使用的简单操作,lamda最有用。,否则应用函数。
3.参数绑定。。跳过

part4.再谈迭代器
1.插入迭代器
三类:back_inserter,front_inserter,inserter
需要容器支持,比如push_back操作
2.流迭代器
istream usage:
istream_iterator<int> in_iter( cin ), eof;
vector< int > vec (in_iter, eof );//从cin读取int,并从迭代器范围构造vec
also we have:
istream_iterator<int> in_iter( cin ), eof;
cout << accumulate (in , eof ,0 ) << endl;//求和istream ,可以用于文件流

ostream usage:
ostream_iterator <int > out_iter( cout, “" );
copy(vec.begin(), vec.end(), out_iter);     //打印vec中的元素
cout << endl;

也可以处理类类型,只要定义了输入出运算符(>> /<<)
3.反向迭代器
sort(words,rbegin(), words.rend());
支持递减--
需要base()成员函数转为普通迭代器。

part5.泛型算法结构
0.向算法传递能力差的迭代器会产生错误,编译器也不管
1.输入迭代器,只读,单遍,只递增。只用于顺序访问,find,accumulate,istream_iterator
2.输出迭代器,只写,单遍,只递增。ostream_iterator
3.前向迭代器,读写,多遍,只递增。replace, forward_list
4.双向迭代器,读写,多遍,增减。reverse
5.随机访问迭代器,读写,多遍,全部。迭代器可减,下表运算符。sort,array,deque,string,vector,内置数组的指针。
6.形参模式
alg(beg, end, others)
alg(beg, end, dest, others)     //假定目标空间足够写入数据
alg(beg, end, beg2, others)     //假定beg2开始的序列与beg和end所表示的范围至少一样大
alg(beg, end, beg2,end2,others)
7.命名规范
_if版本
拷贝和非拷贝版本
remove_if(v1.begin(), v1.end(),
    [ ] )(int i ) { return i % 2} );     //删除序列中的奇数
8.特定容器算法--list,forward_list
优先使用成员函数版本,而非通用版本
list.merge(list2)//合并有序链表
list.remove_if(pred)//条件删除
splice()
区别:链表版本会改变底层容器。remove会删除指定元素。merge后,不想通用版本那样两个输入序列不变,特有版本会销毁给定链表,并合并到同一个链表中。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值