百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

C++ STL find和find_if算法与bind、lambda组合使用

ztj100 2025-01-03 20:47 14 浏览 0 评论

  • std::find
  • std::find_if
  • std::bind
  • std::distance
  • lambda
  • 直接上代码,使用std::find、std::find_if来搜索匹配,代码确实比for循环变少和更好看了,但是时间复杂度还是O(n),见下文。

    #include <algorithm>
    #include <functional>
    #include <iostream>
    #include <string>
    #include <vector>
    
    class Item {
     private:
      int mId;
      std::string mName;
    
     public:
      Item(int id, std::string name) : mId(id), mName(name) {}
    
      std::string getName() const { return mName; }
    
      int getId() const { return mId; }
    
      bool operator==(const Item& obj2) const {
        return (this->getName().compare(obj2.getName()) == 0) &&
               (this->getId() == obj2.getId());
      }
    
      static bool Compare(const Item& obj1, const Item& obj2) {
        return (obj1.getName().compare(obj2.getName()) == 0) &&
               (obj1.getId() == obj2.getId());
      }
    };
    
    #define log(obj, pos)                                                      \
      do {                                                                     \
        if (it != sItemList.end()) {                                           \
          std::cout << "Found obj " << obj.getName() << ", id:" << it->getId() \
                    << ",name: " << it->getName() << ",position:" << pos       \
                    << std::endl;                                              \
        } else {                                                               \
          std::cout << "Not Found obj" << std::endl;                           \
        }                                                                      \
      } while (false)
    
    std::vector<Item> sItemList = {{0, "A"}, {1, "B"}, {2, "C"}, {3, "D"}, {4, "E"},
                                   {5, "E"}, {6, "G"}, {7, "H"}, {1, "B"}};
    
    int main() {
      Item obj1(1, "B");
      Item obj2(8, "I");
      Item obj3(5, "E");
      Item obj4(7, "H");
    
      std::cout << "obj1 is equal obj1 : " << (obj1 == obj1) << std::endl;
      std::cout << "obj1 is equal obj2 : " << (obj1 == obj2) << std::endl;
    
      // 1. std::find 类重载运算符==,使用默认的比较函数查找等于的项
      std::vector<Item>::iterator it =
          std::find(sItemList.begin(), sItemList.end(), obj1);
      log(obj1, std::distance(sItemList.begin(), it));
    
      // 2. std::find 类重载运算符==,使用默认的比较函数d方向查找等于的项
      std::vector<Item>::reverse_iterator rit =
          std::find(sItemList.rbegin(), sItemList.rend(), obj1);
      log(obj1, (sItemList.size() - std::distance(sItemList.rbegin(), rit)));
    
      // 3. std::find_if 使用自定义的函数查找符合要求的项
      it = std::find_if(sItemList.begin(), sItemList.end(),
                        std::bind(Item::Compare, std::placeholders::_1, obj3));
      log(obj3, std::distance(sItemList.begin(), it));
    
      // 4. std::find_if使用 lambda 表达式查找符合的项
      it = std::find_if(
          sItemList.begin(), sItemList.end(),
          [&obj4](Item const& obj) { return Item::Compare(obj, obj4); });
      log(obj4, std::distance(sItemList.begin(), it));
    
      return 0;
    }

    编译运行结果:

    $ g++ std_find.cpp  --std=c++11;./a.out
    obj1 is equal obj1 : 1
    obj1 is equal obj2 : 0
    Found obj B, id:1,name: B,position:1
    Found obj B, id:1,name: B,position:9
    Found obj E, id:5,name: E,position:5
    Found obj H, id:7,name: H,position:7


    std::find算法的行为如下所示,时间复杂度为O(n):

    template<class InputIterator, class T>
      InputIterator find (InputIterator first, InputIterator last, const T& val)
    {
      while (first!=last) {
        if (*first==val) return first;
        ++first;
      }
      return last;
    }

    相关推荐

    如何将数据仓库迁移到阿里云 AnalyticDB for PostgreSQL

    阿里云AnalyticDBforPostgreSQL(以下简称ADBPG,即原HybridDBforPostgreSQL)为基于PostgreSQL内核的MPP架构的实时数据仓库服务,可以...

    Python数据分析:探索性分析

    写在前面如果你忘记了前面的文章,可以看看加深印象:Python数据处理...

    CSP-J/S冲奖第21天:插入排序

    ...

    C++基础语法梳理:算法丨十大排序算法(二)

    本期是C++基础语法分享的第十六节,今天给大家来梳理一下十大排序算法后五个!归并排序...

    C 语言的标准库有哪些

    C语言的标准库并不是一个单一的实体,而是由一系列头文件(headerfiles)组成的集合。每个头文件声明了一组相关的函数、宏、类型和常量。程序员通过在代码中使用#include<...

    [深度学习] ncnn安装和调用基础教程

    1介绍ncnn是腾讯开发的一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,但是通常都需要protobuf和opencv。ncnn目前已在腾讯多款应用中使用,如QQ,Qzon...

    用rust实现经典的冒泡排序和快速排序

    1.假设待排序数组如下letmutarr=[5,3,8,4,2,7,1];...

    ncnn+PPYOLOv2首次结合!全网最详细代码解读来了

    编辑:好困LRS【新智元导读】今天给大家安利一个宝藏仓库miemiedetection,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三合一,其中的PPYOL...

    C++特性使用建议

    1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...

    Qt4/5升级到Qt6吐血经验总结V202308

    00:直观总结增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的方法废...

    到底什么是C++11新特性,请看下文

    C++11是一个比较大的更新,引入了很多新特性,以下是对这些特性的详细解释,帮助您快速理解C++11的内容1.自动类型推导(auto和decltype)...

    掌握C++11这些特性,代码简洁性、安全性和性能轻松跃升!

    C++11(又称C++0x)是C++编程语言的一次重大更新,引入了许多新特性,显著提升了代码简洁性、安全性和性能。以下是主要特性的分类介绍及示例:一、核心语言特性1.自动类型推导(auto)编译器自...

    经典算法——凸包算法

    凸包算法(ConvexHull)一、概念与问题描述凸包是指在平面上给定一组点,找到包含这些点的最小面积或最小周长的凸多边形。这个多边形没有任何内凹部分,即从一个多边形内的任意一点画一条线到多边形边界...

    一起学习c++11——c++11中的新增的容器

    c++11新增的容器1:array当时的初衷是希望提供一个在栈上分配的,定长数组,而且可以使用stl中的模板算法。array的用法如下:#include<string>#includ...

    C++ 编程中的一些最佳实践

    1.遵循代码简洁原则尽量避免冗余代码,通过模块化设计、清晰的命名和良好的结构,让代码更易于阅读和维护...

    取消回复欢迎 发表评论: