(1) 一个初学者非常容易犯的错误是在一个空容器上调用fill_n,空容器长度为0。
vector<int> vec; fill_n(vec.begin(),10,0);//灾难,修改了是个不存在的元素
(2)向目的位置迭代器写入数据的算法假定目的位置足够大,能容纳要写入的元素。
(3)一种保证算法有足够元素空间来容纳输出数据的方法是使用插入迭代器。 插入迭代器是一种向容器中添加元素的迭代器。
(4)常常使用back_inserter来创建一个迭代器,作为算法的目的位置来使用。
vector<int> vec; fill_n(back_inserter(vec),10,0);//正确(5)sort函数利用的是<运算符来实现排序的。
(6)标准库算法对迭代器而不是容器进行操作,因此,算法不能直接删除或者添加元素。
(7)谓词是一个可调用的表达式,其返回的结果是一个能用做条件的值。
(8)标准库算法所用的谓词主要分为两种:一元谓词和二元谓词
bool isShorter(const string &s1, const string &s2) { renturn s1.size() < s2.size(); } stable_sort(words.begin(),words.end(),isShorter);//第三个参数就是一元谓词。
(9)lambda表达式表示可调用的代码单元。
(10)lambda必须使用尾置返回来指定返回值类型,如果lambda的函数体内包含任何单一return语句之外的内容,且未指定返回值类型,则返回void。
(11)一个lambda只有在其捕获列表中捕获一个它所在的函数中的局部变量,才能在函数体中使用该变量。
(12)捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字。
(13)使用lambda、谓词、算法技术对一列单词排序输出:
void biggies(vector<string> &words , vector<string>::size_type sz) { elimDups(Words); stable_sort(words.begin() , words.end() , [](const string &a , const string &b){ return a.size() < b.size(); } ); auto wc = find_if( words.begin() , words.end() , [sz](const string &a){ return a.size() >= sz ; }); auto cout = words.end() - wc; cout << count << " " << make_plural(count , "word" , "s") << " of length " << sz << " or longer " << endl; for_each(wc, words.end(), [](const string &s){cout << s << " ";}); cout << endl; }
(14)由于被捕获的值是在lambda创建时拷贝的,因此随后对其修改不会影响到lambda内对应的值。
(15)当以引用方式捕获一个变量时,必须保证在lambda执行时变量是存在的。
(16)一般来说,我们应该尽量减少捕获的数量,来避免潜在的捕获导致的问题。而且,如果可能的话,应该避免捕获指针或引用。
(17)当混合使用隐式捕获和显式捕获时,捕获列表中的第一个元素必须是一个&或=。此符号指定了默认的捕获方式为引用或值。
(18)当混合使用隐式捕获和显式捕获时,显式捕获的变量必须使用与隐式捕获不同的方式。
(19)bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表。
auto g(X , Y) = bind(f , a , b , Y , c , X);
(20)函数ref返回一个对象,包含给定的引用,此对象是可以拷贝的。标准库中还有个cref函数,生成一个保存const引用的类。