程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 實戰c++中的vector系列--對vector(自定義類)使用std::find 和 std::find_if 算法

實戰c++中的vector系列--對vector(自定義類)使用std::find 和 std::find_if 算法

編輯:C++入門知識

實戰c++中的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 getItemList()
{
    std::vector 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 vecOfItems = getItemList();
    std::vector::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
#include
#include
#include
#include
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 getItemList()
{
    std::vector 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 vecOfItems = getItemList();
    std::vector::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 vecOfItems = getItemList();
std::vector::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 ::"<getPrice()<<" Count :: "<getCount()<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved