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反向迭代器改成正向

猜你喜欢

转载自www.cnblogs.com/xiaodangxiansheng/p/12766665.html