C++ Primer 第五版 中文版 阅读笔记 + 个人思考
- 第 10 章 泛型算法
- 10.1 概述
- 练习10.1
- 练习10.2
第 10 章 泛型算法
泛型的体现:容器类型(包括内置数组),元素类型,元素操作方法。
顺序容器定义的操作:insert,erase,back,front,empty,begin_iterator,end_next_iterator。
10.1 概述
算法在容器泛型上的实现:遍历由两个迭代器指定的一个元素范围进行操作。
算法依赖于元素类型支持的操作,允许我们自定义操作代替默认的运算符。
代码演示:find操作的是迭代器,可以用于任何容器。
#include <iostream>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <algorithm> int main() {// 1. 在一个向量中查找元素 std::vector<int> vec = { 1, 2, 3, 4, 5 };int valToFind = 3;if (std::find(vec.begin(), vec.end(), valToFind) != vec.end()) {std::cout << "Found " << valToFind << " in vector." << std::endl;}else {std::cout << valToFind << " not found in vector." << std::endl;}// 2. 在一个列表中查找元素 std::list<int> lst = { 1, 2, 3, 4, 5 };valToFind = 4;if (std::find(lst.begin(), lst.end(), valToFind) != lst.end()) {std::cout << "Found " << valToFind << " in list." << std::endl;}else {std::cout << valToFind << " not found in list." << std::endl;}// 3. 在一个集合中查找元素(集合中的元素是唯一的,所以只会找到一个匹配项) std::set<int> s = { 1, 2, 3, 4, 5 };valToFind = 3;if (std::find(s.begin(), s.end(), valToFind) != s.end()) {std::cout << "Found " << valToFind << " in set." << std::endl;}else {std::cout << valToFind << " not found in set." << std::endl;}// 4. 在一个映射中查找元素(键值对) std::map<int, std::string> m = { {1, "one"}, {2, "two"}, {3, "three"} };auto mit = std::find(m.begin(), m.end(), std::make_pair(2, "two"));if (mit != m.end()) {std::cout << "Found " << mit->first << " in map with value: " << mit->second << std::endl;}else {std::cout << valToFind << " not found in map." << std::endl;}return 0;
}
运行结果:
代码演示:find函数用于内置数组。
#include <iostream>
#include <algorithm>int main()
{int array[5] = { 1,2,3,4,5 };int val = 4;if (std::end(array) != std::find(std::begin(array), std::end(array), val)){std::cout << val << " is present" << std::endl;}else{std::cout << val << " is not present" << std::endl;}if (array + 2 != std::find(array, array + 2, val)){std::cout << val << " is present" << std::endl;}else{std::cout << val << " is not present" << std::endl;}return 0;
}
运行结果:
算法运行于迭代器之上,不会修改容器大小。
存在插入器 inserter :赋值时,在底层容器上执行插入操作。
练习10.1
代码演示:
#include <iostream>
#include <algorithm>
#include <vector>int main()
{std::vector<int> vi = { 1,2,3,3,3,4,5 };int val = 3;std::cout << val << " count: " << std::count(vi.begin(), vi.end(), val) << std::endl;val = 2;std::cout << val << " count: " << std::count(vi.begin(), vi.end(), val) << std::endl;return 0;
}
运行结果:
练习10.2
代码演示:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>int main()
{std::vector < std::string > vs = { "hello","hello","hello","world","world" };std::string val = "hello";std::cout << val << " count: " << std::count(vs.begin(), vs.end(), val) << std::endl;val = "world";std::cout << val << " count: " << std::count(vs.begin(), vs.end(), val) << std::endl;return 0;
}
运行结果: