c++基础(四)—— 泛型算法
1.find(first, last, value)
- 头文件:algorithm
- 参数:前两个参数是“表示元素范围的迭代器”,第三个是一个值
- 说明:find 将范围中进行寻找。搜索失败:如果范围中无匹配元素,则find返回第二个参数来表示。搜索成功:返回指向第一个等于给定值的迭代器。
- 示例:
-
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 using namespace std; 5 6 int main() { 7 8 int v1 = 5; 9 int a1 = 4; 10 11 vector<int> v{ 0, 1, 2, 3, 4 }; 12 int a[] = { 0, 1, 2, 3, 4 }; 13 14 // 可用 auto 替代 15 vector<int>::iterator result1 = find(v.begin(), v.end(), v1); 16 int *result2 = find(begin(a), end(a), a1); 17 18 if (result1 == v.end()) { 19 cout << "v not found "<< v1 << endl; 20 } else { 21 cout << "v found " << v1 << endl; 22 } 23 24 if (result2 == end(a)) { 25 cout << "a not found " << a1 << endl; 26 } else { 27 cout << "a found " << a1 << endl; // 可见 *(end(a))!=4. 而 *(begin(a))==0 28 } 29 30 getchar(); 31 return 0; 32 }
2.find_if(first, last, p)
- 头文件:algorithm
- 参数:前两个参数表示范围,第三个参数是一个谓词 (只接受单一参数的函数)
- 说明:对输入序列中的每个元素条用给定的这个谓词。搜索失败:返回尾迭代器。搜索成功:返回第一个使谓词返回非0值的元素。
- 示例:
-
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 using namespace std; 5 6 int judge(int i) { // 一元谓词,只能传入一个参数 7 return i % 2; 8 } 9 10 int main() { 11 12 13 vector<int> v{ 0, 2, 7, 5 }; 14 15 // 可用 auto 替代 16 vector<int>::iterator result1 = find_if(v.begin(), v.end(), judge);// 返回第一个奇数 17 18 if (result1 != v.end()) { 19 cout << "第一个奇数:"<< *result1 << endl; 20 } else { 21 cout << "无奇数 " << endl; 22 } 23 24 25 getchar(); 26 return 0; 27 }
3.back_inserter(Container& c )
- 头文件:iterator
- 参数:接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器。
- 说明:当我们通过此迭代器赋值时,赋值运算符会调用 push_back 将一个具有给定值的元素添加到容器
- 示例:
-
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<iterator> 5 using namespace std; 6 7 int main() { 8 9 vector<int> v4; 10 auto iter = back_inserter(v4); 11 //back_insert_iterator<vector<int>> iter = back_inserter(v4); 12 *iter = 44; 13 for (auto elem : v4) { 14 std::cout << elem << " "; 15 } 16 17 getchar(); 18 return 0; 19 }
4.fill(first, last, value),fill_n(first, count, value)
- 头文件:algorithm
- 参数:fill——接受一对迭代器表示一个范围,还接受一个值作为第三个参数,将给定的这个值赋予输入序列中的每个元素。fill_n——接受一个单迭代器、一个计数值和一个值。它将给定值赋予迭代器指向的元素开始的指定个元素。
- 说明:fill 可以对空容器操作,但是 fill_n 不能对空容器操作(但是可用 back_inserter 解决)。
- 示例:
-
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<iterator> 5 using namespace std; 6 7 int main() { 8 9 /// fill 10 vector<int> v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 11 //vector<int> v; // 容器为空。可以使用 12 fill(v.begin(), v.end(), 99); 13 for (auto elem : v) { 14 std::cout << elem << " "; 15 } 16 cout << endl; 17 18 ///fill_n 19 vector<int> v2{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 20 fill_n(v2.begin(), 5, 99); 21 for (auto elem : v2) { 22 std::cout << elem << " "; 23 } 24 cout << endl; 25 26 vector<int> v3; // 容器为空(使用错误) 27 //fill_n(v3.begin(), 5, 99); // 报错 28 //使用back_inerter解决 29 fill_n(back_inserter(v3), 10, -1); 30 for (auto elem : v3) { 31 std::cout << elem << " "; 32 } 33 34 35 getchar(); 36 return 0; 37 }
5.copy(first, last, d_first)
- 头文件:algorithm
- 参数:前两个表示输入范围,第三个表示目的序列的起始位置。传递给copy的目的序列至少要包含与输入序列一样多的元素!
- 说明:copy返回值:copy返回的是其目的位置迭代器(递增后)的值。
- 示例:
-
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<iterator> 5 using namespace std; 6 7 int main() { 8 9 vector<int> v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 10 vector<int> v2; 11 //auto result = copy(v.begin(), v.end(), v2.begin());//报错。v2为空 12 auto result = copy(v.begin(), v.end(), back_inserter(v2)); 13 for (auto elem : v2) { 14 cout << elem << " "; 15 } 16 cout << endl; 17 18 //我们可以用copy实现内置数组的拷贝 19 int a1[] = { 0,1,2,3,4,5,6,7,8,9 }; 20 int a2[sizeof(a1) / sizeof(*a1)]; //a2与a1大小一样 21 //ret指向拷贝到a2的尾元素之后的位置 22 auto ret = copy(begin(a1), end(a1), a2); // 把a1的内容拷贝给a2 23 for (auto elem : a2) { 24 cout << elem << " "; 25 } 26 cout << *(--ret) << " "; // 输出9。ret恰好指向拷贝到a2的尾元素之后的位置。 27 28 29 getchar(); 30 return 0; 31 }
6.replace(first, last, old_value, new_value)
- 头文件:algorithm
- 参数:前两个是迭代器,表示输入序列,后两个一个是要搜索的值,另一个是新值。
7.sort(first, last),sort(first, last, comp)
- 头文件:algorithm
- 参数:排序范围。comp——比较函数对象(即满足比较(Compare) 概念的对象),若第一参数小于(即先序于)第二参数则返回 true 。比较函数的签名应等价于如下:bool cmp(const Type1 &a, const Type2 &b);
- 说明:默认情况 sort 是按照 < 运算符进行运算
- 示例:
-
1 #include <algorithm> 2 #include <functional> 3 #include <array> 4 #include <iostream> 5 6 int main() 7 { 8 std::array<int, 10> s = { 5, 7, 4, 2, 8, 6, 1, 9, 0, 3 }; 9 10 // 用默认的 operator< 排序 11 std::sort(s.begin(), s.end()); 12 for (auto a : s) { 13 std::cout << a << " "; //0 1 2 3 4 5 6 7 8 9 14 } 15 std::cout << '\n'; 16 17 // 用标准库比较函数对象排序 18 std::sort(s.begin(), s.end(), std::greater<int>()); 19 for (auto a : s) { 20 std::cout << a << " "; //9 8 7 6 5 4 3 2 1 0 21 } 22 std::cout << '\n'; 23 24 // 用自定义函数对象排序 25 struct { 26 bool operator()(int a, int b) const 27 { 28 return a < b; 29 } 30 } customLess; 31 std::sort(s.begin(), s.end(), customLess); 32 for (auto a : s) { 33 std::cout << a << " "; //0 1 2 3 4 5 6 7 8 9 34 } 35 std::cout << '\n'; 36 37 // 用 lambda 表达式排序 38 std::sort(s.begin(), s.end(), [](int a, int b) { 39 return b < a; 40 }); 41 for (auto a : s) { 42 std::cout << a << " "; //9 8 7 6 5 4 3 2 1 0 43 } 44 std::cout << '\n'; 45 }
============
当我沉默时,我觉得充实。当我开口说话时,却觉得空虚
===========