C++ Primer 第五版 中文版 阅读笔记 + 个人思考

第 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;
}

运行结果:
C++ Primer 第五版 中文版 阅读笔记 + 个人思考-LMLPHP

代码演示: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;
}

运行结果:
C++ Primer 第五版 中文版 阅读笔记 + 个人思考-LMLPHP

算法运行于迭代器之上,不会修改容器大小。
存在插入器 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;
}

运行结果:
C++ Primer 第五版 中文版 阅读笔记 + 个人思考-LMLPHP

练习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;
}

运行结果:
C++ Primer 第五版 中文版 阅读笔记 + 个人思考-LMLPHP

01-10 12:51