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;
}
运行结果: