c++ Primer 第十章不熟悉知识点总结
Posted xiaodangxiansheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ Primer 第十章不熟悉知识点总结相关的知识,希望对你有一定的参考价值。
(1)大多数算法都定义在头文件algorithm中。标准库还在头文件numeric中定义了一组数值泛型算法。
1 int ia[] = { 27, 23, 45, 56 }; 2 int val = 56; 3 int* result = find(begin(ia), end(ia), val); //使用了便准库中begin和end函数
(2)只读算法
accumulate算法是求和算法,使用的是+运算符,所以我们也可以利用这个算法来把字符数组变成字符串。accumulate算法在头文件numeric
1 vector<char> vec = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘}; 2 string str = accumulate(vec.cbegin(), vec.cend(), string("")); 3 string str = accumulate(vec.cbegin(), vec.cend(), ""); //这样写是有问题的,因为“”是const char*,而这个类型没有+运算符,所以我们使用string类型的
equal判断两个容器中的元素是否相等。
1 vector<char> vec = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘}; 2 list<char> lis = { ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘f‘ }; 3 bool temp = equal(vec.cbegin(), vec.cend(), lis.cbegin());
(3)可写算法
fill算法。不能向空容器赋值,没办法赋值给不存在元素
1 vector<char> vec = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘}; 2 list<char> lis = { ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘f‘ }; 3 fill(vec.begin(), vec.end(), ‘a‘); //赋值给给定范围容器的元素 4 fill_n(vec.begin(), 7, ‘a‘); //从begin开始给7元素赋值,不能向空容器赋值,没办法赋值给不存在元素
back_inserter接受一个容器的引用,返回一个与该容器绑定的插入迭代器,头文件为iterator
1 vector<char> vec = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘}; 2 auto temp = back_inserter(vec); 3 *temp = ‘a‘; //增加了一个元素到vector中 4 5 vector<char> vtr; 6 fill_n(back_inserter(vtr), 6, ‘h‘);
copy函数接受三个参数
1 int arr1[] = { 1,2,3,4,5 }; 2 int arr2[sizeof(arr1)]; 3 copy(begin(arr1), end(arr1), arr2); //返回的是指向end(arr1)
(3)排算法
sort算法第三个参数默认降序排序,可以自己指定排序方法,stable_srot不会改变原来元素的顺序,但是sort是快速排序,所以可能会改变相同元素原来的位置。
1 bool myfunction(int x, int y) 2 { 3 return x > y; 4 } 5 6 int main() 7 { 8 int arr1[] = { 1,2,3,4,5 }; 9 sort(begin(arr1), end(arr1), myfunction); 10 std::cin.get(); 11 return 0; 12 }
unique函数是去重复函数,但是不会删除元素,只会删掉重复的值,然后没有值的元素在最后给了一个不确定的值。且区间是不包括最后一个元素的
1 vector<int> arr1 = { 1,2,3,4,5,3,2 }; 2 sort(begin(arr1), end(arr1), myfunction); 3 4 auto temp = unique(begin(arr1), end(arr1)); //返回的引用是指向移到最后的原来重复的值的地方 5 arr1.erase(temp, arr1.end()); //我们需要把后面的删重后的无效值删除
(4)lambda
[捕获列表](参数)-> 返回类型 { 函数体 } 其中[]和{}必不可少,其他的可以省略。
1 for_each(arr1.begin(), arr1.end(), [](const int &s) { cout << s << " "; });
lambda的捕获的参数是在lambda创建时捕获的,不是在调用的时候,所以在lambda之后,参数被改变也不会影响lambda。
(5)transform函数
transform函数的作用是:将某操作应用于指定范围的每个元素。transform函数有两个重载版本:
transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class。
transform(first1,last1,first2,result,binary_op);//first1是第一个容器的首迭代 器,last1为第一个容器的末迭代器,first2为第二个容器的首迭代器,result为存放结果的容器,binary_op为要进行操作的二元函数 对象或sturct、class。
1 transform(arr1.begin(), arr1.end(), arr1.begin(), [](int x) {return x + 1; });
(6)bind函数可以看做是一个通用适配器,他接受一个可调用对象,生成一个新的可调用对象来适应对象的参数列表,定义在functional中
1 vector<int> arr1 = { 1,2,3,4,5,3,2 }; 2 int a = 6; 3 find_if(arr1.begin(), arr1.end(), bind(getResult,std::placeholders::_1,a)) //bind去调用getResult函数,然后把参数给他。_1是占位符。placeholders是命名空间
4 find_if(arr1.begin(), arr1.end(), bind(getResult,std::placeholders::_1,_2)) //当然我们也可以写成这样,因为getResult有两个参数,完全可以由bind提供。
(7)插入迭代器
back_inserter 创建一个push_back迭代器
front_inserter 创建一个push_front迭代器
inserter 创建迭代器,第一个参数是容器,第二个参数必须是指向容器的迭代器。是把整个值插入到迭代器前面,而front_inserter是一个一个的插入到迭代器前面
1 vector<int> arr1 = { 1,2,3,4}; 2 vector<int> arr2, arr3; 3 copy(arr1.cbegin(), arr1.cend(), front_inserter(arr2)); //结果是 4321 4 copy(arr1.cbegin(), arr1.cend(), inserter(arr3, arr3.begin())); //结果是 1234
(8)反向迭代器
1 char arr[] = "hello,world"; 2 auto temp = find(rbegin(arr), rend(arr), ‘,‘); //找到逗号,返回指向逗号的迭代器 3 cout << string(temp.base(), end(arr)) << endl; //这里使用base函数把temp反向迭代器改成正向
以上是关于c++ Primer 第十章不熟悉知识点总结的主要内容,如果未能解决你的问题,请参考以下文章