zoukankan      html  css  js  c++  java
  • vector系列--对vector<自定义类>使用std::find 和 std::find_if 算法

    之前博客讲了一些关于std::find和std::find_ if的一些用法,但是没有讲述对于vector中存储的是自定义的类,那么怎么样使用std::find和std::find_if进行查找呢?

    先定义一个类:

    class Item
    {
    private:
        std::string  m_ItemId;
        int m_Price;
        int m_Count;
    public:
        Item(std::string id, int price, int count):
            m_ItemId(id), m_Count(count), m_Price(price){}
        int getCount() const {
            return m_Count;
        }
        std::string getItemId() const {
            return m_ItemId;
        }
        int getPrice() const {
            return m_Price;
        }
        bool operator==(const Item & obj2) const
        {
            if(this->getItemId().compare(obj2.getItemId()) == 0)
                return true;
            else
                return false;
        }
    };
    std::vector<Item> getItemList()
    {
        std::vector<Item> vecOfItems ;
        vecOfItems.push_back(Item("D121",100,2));
        vecOfItems.push_back(Item("D122",12,5));
        vecOfItems.push_back(Item("D123",28,6));
        vecOfItems.push_back(Item("D124",8,10));
        vecOfItems.push_back(Item("D125",99,3));
        return vecOfItems;
    }
    

      接下来就是使用std::find算法了:

    int main()
    {
        std::vector<Item> vecOfItems = getItemList();
        std::vector<Item>::iterator it;
        it = std::find(vecOfItems.begin(), vecOfItems.end(), Item("D123", 99, 0));
        if (it != vecOfItems.end())
            std::cout << "Found with Price ::" << it->getPrice() << " Count :: " << it->getCount() << std::endl;
        else
            std::cout << "Item with ID :: D126 not Found" << std::endl;
        return 0;
    }
    
    //输出:
    Found with Price ::28 Count :: 6
    

      但是如果不能使用==的情况下,我们就可以使用find_if解决问题了:
    增加函数:

    bool priceComparision(Item & obj, int y)
    {
        if(obj.getPrice() == y)
            return true;
        else
            return false;
    }
    

      就是这样:

    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>
    #include<functional>
    using namespace std;
    class Item
    {
    private:
        std::string  m_ItemId;
        int m_Price;
        int m_Count;
    public:
        Item(std::string id, int price, int count) :
            m_ItemId(id), m_Count(count), m_Price(price) {}
        int getCount() const {
            return m_Count;
        }
        std::string getItemId() const {
            return m_ItemId;
        }
        int getPrice() const {
            return m_Price;
        }
        bool operator==(const Item & obj2) const
        {
            if (this->getItemId().compare(obj2.getItemId()) == 0)
                return true;
            else
                return false;
        }
    };
    
    bool priceComparision(Item & obj, int y)
    {
        if (obj.getPrice() == y)
            return true;
        else
            return false;
    }
    
    std::vector<Item> getItemList()
    {
        std::vector<Item> vecOfItems;
        vecOfItems.push_back(Item("D121", 100, 2));
        vecOfItems.push_back(Item("D122", 12, 5));
        vecOfItems.push_back(Item("D123", 28, 6));
        vecOfItems.push_back(Item("D124", 8, 10));
        vecOfItems.push_back(Item("D125", 99, 3));
        return vecOfItems;
    }
    
    int main()
    {
        std::vector<Item> vecOfItems = getItemList();
        std::vector<Item>::iterator it;
        it = std::find_if(vecOfItems.begin(), vecOfItems.end(), std::bind(priceComparision, std::placeholders::_1, 28));
        if (it != vecOfItems.end())
            std::cout << "Item Price ::" << it->getPrice() << " Count :: " << it->getCount() << std::endl;
        else
            std::cout << "Item not Found" << std::endl;
        return 0;
    }
    

      最后还可以使用lambda表达式:

    std::vector<Item> vecOfItems = getItemList();
    std::vector<Item>::iterator it;
    it = std::find_if(vecOfItems.begin(), vecOfItems.end(), [](Item const& obj){
            return obj.getPrice() == 28;
        } );
    if(it != vecOfItems.end())
        std::cout<<"Item Price ::"<<it->getPrice()<<" Count :: "<<it->getCount()<<std::endl;
    else
        std::cout<<"Item not Found"<<std::endl;
    

      

  • 相关阅读:
    Unable To Open Database After ASM Upgrade From Release 11.1 To Release 11.2
    11g Understanding Automatic Diagnostic Repository.
    How to perform Rolling UpgradeDowngrade in 11g ASM
    Oracle 11.2.0.2 Patch 说明
    Pattern Matching Metacharacters For asm_diskstring
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    Upgrading ASM instance from Oracle 10.1 to Oracle 10.2. (Single Instance)
    OCSSD.BIN Process is Running in a NonRAC Environment
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    On RAC, expdp Removes the Service Name [ID 1269319.1]
  • 原文地址:https://www.cnblogs.com/noticeable/p/14862169.html
Copyright © 2011-2022 走看看