c++primer笔记----泛型算法

  • 大多数算法在<algorithm>。泛型算法运行在迭代器之上
auto result = find(vec.begin(), vec.end(), val);
int ia = [1, 2, 3];
int * result = find(begin(ia), end(ia));
  • 数组利用指针实现泛型算法
  • 只读算法:findcountaccumulate, <numeric>里equal
  • 迭代器参数:有的算法读取两个序列进行比较或转换,只需要容器中元素可以进行就行。所以vectorlistintdouble都可以的
  • 写容器元素的算法:不做安全性检查、back_inserter可以改变容器大小,通过它赋值,就是插入、拷贝算法
vector <int> vec; 
auto it = back_inserter(vec);
*it = 42; 相当于push_back()

int a1 = {1, 2, 3};
int a2[sizeof(a1)/sizeof(*a1)];
auto ret = copy(begin(a1), end(a1), a2);  //<iterator>中的begin()
  • 重排容器元素的算法
sort(words.begin(), words.end());
auto end_unique = unique(words.begin(), words.end());
words.erase(end_unique, words.end());  //算法不能对容器进行操作
  • 定制操作
bool isShorter(const string &s1, const string &s2)
{
        return s1.size()<s2.size();
}
sort(words.begin(), words.end(), isShorter);

//如果想同等长度下,按照字典顺序
elimDups(words);
stable_sort(words.begin(), words.end(), isShorter);
  • lambda表达式:可能定义在函数的内部,必须使用尾置返回来指定返回类型。
    [comture list一般为空,是lambda所在函数中定义的局部变量的列表] (parameter list) -> return type {function body}。可以省略参数列表和返回类型。如果函数体包含除return之外的语句,且未指定返回类型,则是void
stable_sort(words.begin(), words.end(), [] (const string &a, const string &b)
{return a.size()<b.size()}     //长度短的在前面,返回true的在前面
  • 一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用变量
auto wc = find_if(words.begin(), words.end(), [sz](const string &a) 
{ return a.size() >= sz; } );  //返回第一个长度不小于sz的元素的迭代器
  • 捕获列表只用于局部非static变量,lambda表达式可以直接使用局部static变量和它所在函数之外的声明的变量
for_each(wc, words.end(), [] (const string &a) { cout << s << " ";});
  • 可以这样理解,向函数传递一个lambda时,同时定义了一个新类型和该类型的一个对象:传递的参数就是这个未命名的对象

  • 捕获分为值捕获和引用捕获。当使用引用方式捕获一个变量时,必须保证lambda在执行时是存在的。[a] or [&a]

  • 值捕获也可以改变捕获的值,mutable

[v1] () mutable {return ++v1};
  • 隐式捕获:[= or &]让编译器推断捕获列表
  • 混合捕获:[=, &a]默认的是值捕获,引用捕获需要显示捕获
  • 参数绑定:bind
//在<functional>
bool check_size(const string &s, string::size_type sz)
{
    return s.size() >= sz;
}
using std::placeholder::_1;
auto check6 = bind(check_size, _1, 6);  //表示check6(_1) -> check_size(_1, 6)

//bind的那些不是占位符的参数被拷贝到Bind返回的可调用对象中
//如果不能拷贝
ostream &print(ostream &os, const string &s, char c)
{
    return os << s << c;
}

bind(print, ref(os), _1, ' ');    //ref函数定义在<functional>,  cref
  • 插入迭代器:接受一个容器,生成一个迭代器,实现向给定容器添加元素
back_inserter : push_back
front_inserter : push_front
inserter : insert(it, val)
  • iostream迭代器:istream_iterator操作
istream_iterator<int> int_it(cin);  //从cin中读取Int数据
istream_iterator<int> eof;  //尾后迭代器
while (in_iter != eof)
      vec.push_back(*in_iter++);

//或者从迭代器范围构造vec,当关联的流遇到文件尾或IO错误,迭代器的值就是eof
vector<int> vec(in_iter, eof)

//使用算法操作流迭代器
cout << accumulate(in, eof, 0)
  • ostream_iterator的操作
ostream_iterator<int> out_iter(cout, " "); //在输出每个int后,输出" "
for(auto e :  vec)
    *out_iter++ = e;   //等价于 out_iter = e
cout << endl;

//或者调用copy , std::copy, <algorithm>
copy(vec.begin(), vec.end(), out_iter);
cout << endl;
  • 使用流迭代器处理类类型
istream_iterator<Sales_item> item_iter(cin), eof;    //类定义了 << 
ostream_iterator<Sales_item> out_iter(cout, "\n");  //类定义了 >>
  • 反向迭代器
vec.crbegin()  //++之后指向前一个元素

cr_test.base();   //装换为正向迭代器
  • 迭代器类别:输入迭代器,find、输出迭代器,copy and ostream_iterator、前向迭代器,replace,可进行同一个位置的多次读写、双向迭代器,list的迭代器、随机访问迭代器,array, deque, string, vector的迭代器

  • 对于每个迭代器参数来说,其能力必须与规定的最小类别相当

  • 算法命名规范

unique(beg, end);
unique(beg, end ,comp);   //使用重载形式传递一个谓词

//_if
find(beg, end, val)
find(beg, end, pred)  //返回第一个令pred为真的元素

//拷贝与不拷贝
reverse(beg, end);
reverse_copy(beg, end, dest)
  • 特定容器的算法:是list和forward_list的成员函数算法,有的操作会改变容器
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,520评论 1 51
  • 2. C++标准库 2.1 IO库 IO对象无拷贝或赋值,进行IO操作的函数通常以引用方式传递和返回流。 IO库条...
    王侦阅读 1,331评论 0 0
  • 顺序容器中只定义了添加删除访问等简单操作,用户更多的需求,只能通过泛型算法实现。此类算法称之为"泛型"是因为它们可...
    saviochen阅读 1,090评论 0 4
  • 10.1 概述 #include //大部分算法定义 #include <numeric> //数值泛型算法 ...
    龙遁流阅读 577评论 0 1
  • 把酒祝东风,且共从容,垂杨紫陌洛城东。总是当时携手处,游遍芳丛。聚散苦匆匆,此恨无穷。今年花胜去年红。可惜明年花更...
    MaxBay阅读 327评论 0 0