多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
##实战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<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; ~~~