首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ vector 實戰:自定義類型的查找(find、find_if、lambda)

     編輯:關於C++

一、場景介紹

當 vector 存儲自定義類對象時,如何使用 std::find、std::find_if 進行查找?本文通過完整示例演示三種方式。

二、定義類與數據準備

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;

class Item {
private:
    string m_ItemId;
    int m_Price;
    int m_Count;
public:
    Item(string id, int price, int count) 
        : m_ItemId(id), m_Price(price), m_Count(count) {}
    int getCount() const { return m_Count; }
    string getItemId() const { return m_ItemId; }
    int getPrice() const { return m_Price; }
    // 重載 ==,供 find 使用(按 ID 比較)
    bool operator==(const Item& obj2) const {
        return m_ItemId == obj2.m_ItemId;
    }
};

vector<Item> getItemList() {
    vector<Item> vec;
    vec.emplace_back("D121", 100, 2);
    vec.emplace_back("D122", 12, 5);
    vec.emplace_back("D123", 28, 6);
    vec.emplace_back("D124", 8, 10);
    vec.emplace_back("D125", 99, 3);
    return vec;
}

三、方式一:std::find(需重載 ==)

int main() {
    vector<Item> vec = getItemList();
    auto it = find(vec.begin(), vec.end(), Item("D123", 0, 0)); // 僅 ID 需匹配
    if (it != vec.end()) {
        cout << "Found: Price=" << it->getPrice() << ", Count=" << it->getCount() << endl;
    } else {
        cout << "Not Found" << endl;
    }
    return 0;
}
// 輸出: Found: Price=28, Count=6

四、方式二:std::find_if + 函數對象(不依賴 ==)

定義比較函數,配合 std::bind 綁定參數:

bool priceComparision(const Item& obj, int targetPrice) {
    return obj.getPrice() == targetPrice;
}

int main() {
    vector<Item> vec = getItemList();
    auto it = find_if(vec.begin(), vec.end(), 
                      bind(priceComparision, placeholders::_1, 28));
    if (it != vec.end()) {
        cout << "Price=28: Count=" << it->getCount() << endl;
    }
    return 0;
}

五、方式三:std::find_if + Lambda 表達式(C++11 推薦)

int main() {
    vector<Item> vec = getItemList();
    auto it = find_if(vec.begin(), vec.end(), 
                      [](const Item& obj) { return obj.getPrice() == 28; });
    if (it != vec.end()) {
        cout << "Lambda: Price=" << it->getPrice() << ", Count=" << it->getCount() << endl;
    }
    return 0;
}

六、總結

  • find:需重載 operator==,適合精確匹配整個對象。
  • find_if + bind:靈活指定比較邏輯,但語法較繁瑣。
  • find_if + lambda:最簡潔、可讀性強,現代 C++ 首選。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved