當 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;
}
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::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;
}
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++ 首選。