重新学习《C++Primer5》第10章-泛型算法

10.3 lamdba捕获

1.值捕获

int sz = 5;
cout<<count_if(words.begin(), words.end(), 
    [sz](const string &s){return s.size() >= sz; })<<endl;

2.引用捕获
3.可变lamdba

auto fun = [sz]()mutable->bool{while (sz == 0)--sz; return true; };

4.推断返回类型

10.4参数绑定

1.当需要传递多个参数时,

bool check_size(const string& s, string::size_type sz)
{
    return s.size() >= sz;
}
auto wc = find_if(words.begin(), words.end(), bind(check_size, _1, sz));

2.bing的参数顺序

auto g=bind(f,a,b,_2,c,_1);
g(_1,_2);//实际上是

sort(words.begin(), words.end(), bind(isShorter, _2, _1));
sort(words.begin(), words.end(), isShorter);
//两个参数调用顺序相反

2.bind绑定引用参数ref

for_each(words.begin(),words.end(),bind(print,os,_1,' ');//错误,不能拷贝os
for_each(words.begin(),words.end(),bind(print, ref(os),_1,' ');//正确
auto it=partition(words.begin(),words.end(),bind(lengthMorethan,_1,sz));

10.5 再谈迭代器

1.插入迭代器

  • back_inserter:创建一个使用push_back的迭代器
  • front_inserter:创建一个使用front_back的迭代器
  • inserter:创建一个使用inserter的迭代器
vector<int> vinsert = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
list<int> l1, l2, l3;
unique_copy(vinsert.begin(), vinsert.end(), back_inserter(l1));
unique_copy(vinsert.begin(), vinsert.end(), front_inserter(l2));
unique_copy(vinsert.begin(), vinsert.end(), inserter(l3, l3.begin()));
for_each(l1.begin(), l1.end(), [](const int &t){cout << t << ","; }); cout << endl;
//123456789
for_each(l2.begin(), l2.end(), [](const int &t){cout << t << ","; }); cout << endl;
//987654321
for_each(l3.begin(), l3.end(), [](const int &t){cout << t << ","; }); cout << endl;
//123456789

2.iostream迭代器

  • istream_iterator
    //标准输入读取数据
    istream_iterator<string> in_iter(cin);
    istream_iterator<string> eof;
    vector<string> words;
    while (in_iter != eof)
        words.push_back(*in_iter++);
    for (auto word : words)
        cout << word << ","; 
  • ostream_iterator
    ostream_iterator<int> out_iter(cout, " ");
    for (auto e : vec2)
        *out_iter++ = e;
//习题1
void readstreamit(ifstream &in)
{
    if (!in)
    {
        cout << "打开输入文件失败!" << endl;
        exit(1);
    }
    istream_iterator<string> in_iter(in);
    istream_iterator<string> eof;
    vector<string> words;
    while (in_iter != eof)
        words.push_back(*in_iter++);
    for (auto word : words)
        cout << word << ","; 
}
void fun()
{
    istream_iterator<int> in_iter(cin),eof;
    vector<int> vec;
    while (in_iter != eof)
    {
        vec.push_back(*in_iter++);
    }
    ostream_iterator<int> out_iter(cout);
    for (auto e : vec)
        *out_iter++ = e;
    unique_copy(vec.begin(), vec.end(), out_iter);
}

3.反向迭代器
从后往前反向移动的迭代器,除了forward_list其它容器都支持

for(auto r_it=vec.crbegin();r_it!=vec.crend();++r_it)
    cout<<*r_it;//倒序输出元素

反向迭代器翻转应用(base成员)

//打印一句话当中的最后一个单词,先找到最后一个逗号,然后输出逗号之后的位置
auto comma=find(words.crbegin(),words.crend(),',');
cout<<string(comma,words.crbegin());//这个结果不是我们想要的,加入words为:first,second,third.这会输出driht;
//需要利用base成员反转
cout<<string(comma.base(),words.cend());

Note:当我们从一个普通迭代器初始化一个反向迭代器,或是给一个反向迭代器赋值时,结果迭代器与原迭代器执行的并不是相同的元素。???

10.6泛型算法结构

  • 输入迭代器
  • 输出迭代器
  • 前向迭代器
  • 双向迭代器
  • 随机访问迭代器

1.算法形参模式
2.特殊容器算法
- 对于list和forward_list,应该优先使用成员函数版本的算法而不是通用算法。

lst.merge(lst2);
lst.remove(val);
lst.sort();
lst.unique();
  • splice成员
lst.splice()
  • 这些算法和通用算法类似,但链表会改变底层容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值