• STL——查找算法及实例


    一 前言

            STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含中则定义了一些模板类,用来声明函数对象。
    STL中算法大致分为四类:
    1)、非可变序列算法:指不直接修改其所操作的容器内容的算法。
    2)、可变序列算法:指可以修改它们所操作的容器内容的算法。
    3)、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
    4)、数值算法:对容器内容进行数值计算。

     二 查找算法(13个)

    判断容器中是否包含某个值

        adjacent_find

      在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。

    1. #include
    2. #include
    3. #include
    4. int main() {
    5. std::vector<int> numbers = {1, 2, 3, 4, 4, 5, 6};
    6. // Find the first pair of adjacent repeated elements
    7. auto it = std::adjacent_find(numbers.begin(), numbers.end());
    8. if (it != numbers.end()) {
    9. std::cout << "Found adjacent repeated elements: " << *it << " and " << *(it + 1) << std::endl;
    10. } else {
    11. std::cout << "No adjacent repeated elements found" << std::endl;
    12. }
    13. return 0;
    14. }
    15. 输出:
    16. Found adjacent repeated elements: 4 and 4


       binary_search

            在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。

    1. #include
    2. #include
    3. #include
    4. int main() {
    5. std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
    6. int value = 3;
    7. // Check if value exists in the sorted sequence
    8. bool found = std::binary_search(numbers.begin(), numbers.end(), value);
    9. if (found) {
    10. std::cout << "Value " << value << " found" << std::endl;
    11. } else {
    12. std::cout << "Value " << value << " not found" << std::endl;
    13. }
    14. return 0;
    15. }
    16. 输出
    17. Value 3 found


        count 

            利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。

    1. #include
    2. #include
    3. #include
    4. int main() {
    5. std::vector<int> numbers = {1, 2, 3, 2, 2, 4, 5};
    6. int value = 2;
    7. // Count the occurrences of value in the range
    8. int count = std::count(numbers.begin(), numbers.end(), value);
    9. std::cout << "Number of occurrences of " << value << ": " << count << std::endl;
    10. return 0;
    11. }
    12. 输出:
    13. Number of occurrences of 2: 3


        count_if 

            利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。

    1. #include
    2. #include
    3. #include
    4. bool isEven(int number) {
    5. return number % 2 == 0;
    6. }
    7. int main() {
    8. std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
    9. // Count the number of even elements in the range
    10. int count = std::count_if(numbers.begin(), numbers.end(), isEven);
    11. std::cout << "Number of even elements: " << count << std::endl;
    12. return 0;
    13. }
    14. 输出:
    15. Number of even elements: 3


        equal_range

            功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。

    1. std::vector<int> nums = {1, 2, 3, 4, 4, 5};
    2. auto range = std::equal_range(nums.begin(), nums.end(), 4);
    3. // range.first指向第一个等于4的元素位置,range.second指向第一个大于4的元素位置
    4. // 在这个例子中,range.first指向索引3处的元素(值为4),range.second指向索引5处的元素(值为5)


        find  

            利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIterator。

    1. std::vector<int> nums = {1, 2, 3, 4, 5};
    2. auto it = std::find(nums.begin(), nums.end(), 3);
    3. // it指向索引2处的元素(值为3)


        find_end

            在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。

    1. std::vector<int> nums = {1, 2, 3, 4, 1, 2, 3, 4};
    2. std::vector<int> subseq = {3, 4};
    3. auto it = std::find_end(nums.begin(), nums.end(), subseq.begin(), subseq.end());
    4. // it指向索引6处的元素(值为3),即最后一次出现子序列{3, 4}的位置

       find_first_of        

            在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符。

    1. std::vector<int> nums = {1, 2, 3, 4, 5};
    2. std::vector<int> search_nums = {4, 6};
    3. auto it = std::find_first_of(nums.begin(), nums.end(), search_nums.begin(), search_nums.end());
    4. // it指向索引3处的元素(值为4),即首次出现search_nums中任意一个元素{4, 6}的位置


        find_if  

            使用输入的函数代替等于操作符执行find。

    1. std::vector<int> nums = {1, 2, 3, 4, 5};
    2. auto it = std::find_if(nums.begin(), nums.end(), [](int num) { return num % 2 == 0; });
    3. // it指向索引1处的元素(值为2),即第一个满足条件(num % 2 == 0)的元素的位置


        lower_bound

             返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函数使用自定义比较操作。

    1. std::vector<int> nums = {1, 2, 3, 4, 5};
    2. auto it = std::lower_bound(nums.begin(), nums.end(), 4);
    3. // it指向索引3处的元素(值为4),即第一个大于等于4的元素的位置


        upper_bound

            返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志一个大于value的值。重载函数使用自定义比较操作。

    1. std::vector<int> nums = {1, 2, 3, 4, 5};
    2. auto it = std::upper_bound(nums.begin(), nums.end(), 4);
    3. // it指向索引4处的元素(值为5),即第一个大于4的元素的位置


        search:

             给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置,查找失败指向last1。重载版本使用自定义的比较操作。

    1. #include
    2. #include
    3. #include
    4. bool customCompare(int a, int b) {
    5. // 自定义比较函数,检查是否a和b相差为1
    6. return (std::abs(a - b) == 1);
    7. }
    8. int main() {
    9. std::vector<int> vec1 {1, 2, 3, 4, 5};
    10. std::vector<int> vec2 {3, 4};
    11. auto it = std::search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());
    12. if (it != vec1.end()) {
    13. std::cout << "子序列在位置 " << std::distance(vec1.begin(), it) << " 处找到" << std::endl;
    14. } else {
    15. std::cout << "未找到子序列" << std::endl;
    16. }
    17. // 使用自定义比较函数
    18. it = std::search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), customCompare);
    19. if (it != vec1.end()) {
    20. std::cout << "子序列在位置 " << std::distance(vec1.begin(), it) << " 处找到" << std::endl;
    21. } else {
    22. std::cout << "未找到子序列" << std::endl;
    23. }
    24. return 0;
    25. }


        search_n

            在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。

    1. #include
    2. #include
    3. #include
    4. bool customCompare(int a, int b) {
    5. // 自定义比较函数,检查是否a和b相差为1
    6. return (std::abs(a - b) == 1);
    7. }
    8. int main() {
    9. std::vector<int> numbers {1, 2, 3, 4, 5, 6, 7, 8, 9};
    10. // 在numbers中查找连续出现3个值为2的子序列
    11. auto it = std::search_n(numbers.begin(), numbers.end(), 3, 2);
    12. if (it != numbers.end()) {
    13. std::cout << "Found the subsequence at index: "
    14. << std::distance(numbers.begin(), it) << std::endl;
    15. } else {
    16. std::cout << "Subsequence not found!" << std::endl;
    17. }
    18. // 使用自定义比较函数在numbers中查找连续出现3个相邻的元素
    19. it = std::search_n(numbers.begin(), numbers.end(), 3, 0, customCompare);
    20. if (it != numbers.end()) {
    21. std::cout << "Found the subsequence at index: "
    22. << std::distance(numbers.begin(), it) << std::endl;
    23. } else {
    24. std::cout << "Subsequence not found!" << std::endl;
    25. }
    26. return 0;
    27. }

  • 相关阅读:
    如何判断SSL证书的安全性高低?越贵越好?懂点原理会少花冤枉钱
    Leetcode | 链表
    深入理解Elasticsearch中的Match Phrase查询
    项目人力资源管理
    【华为OD机试真题 JS】求满足条件的最长子串的长度
    Java国密加密SM3代码
    【机器学习】EM算法
    MongoDB之完整入门知识(集合操作、文档基本CRUD操作、文档分页查询、索引等相关命令)
    2023Linux常见命令手册
    java计算机毕业设计校园快递联盟系统源码+系统+mysql数据库+lw文档
  • 原文地址:https://blog.csdn.net/qq_43611366/article/details/133808782