实战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;
时间: 2024-12-20 12:45:18

实战c++中的vector系列--对vector&lt;自己定义类&gt;使用std::find 和 std::find_if 算法的相关文章

实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----------------------------------------------vcBuf.resize(stBuf.size());vcBuf.assign(stBuf.begin(), stBuf.end()); vector 转 string  stBuf.clear();stBuf.assign(v

实战c++中的vector系列--对vector&lt;自定义类&gt;使用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_Coun

实战c++中的string系列--std:vector&lt;char&gt; 和std:string相互转换(vector to stringstream)

有时候也会遇到std:vector与转std:string 相互转换的情况. 首先看一下vector<char>如何转string: std::vector<char> *data = response->getResponseData(); std::string res; //方法一 for (int i = 0;i<data->size();++i) { res+=(*data)[i]; } res+='\0'; std:cout << res;

实战c++中的string系列--十六进制的字符串转为十六进制的整型(一般是颜色代码使用)

非常久没有写关于string的博客了.由于写的差点儿相同了.可是近期又与string打交道,于是荷尔蒙上脑,小蝌蚪躁动. 在程序中,假设用到了颜色代码,一般都是十六进制的,即hex. 可是server给你返回一个颜色字符串.即hex string 你怎么把这个hex string 转为 hex,并在你的代码中使用? 更进一步,你怎么办把一个形如"#ffceed"的hex string 转为 RGB呢? 第一个问题在Java中是这样搞的: public static int parseC

实战c++中的string系列--string的替换、查找(一些与路径相关的操作)

今天继续写一些string操作. string给我们提供了很多的方法,但是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\program files\csdn",但是我想得到"D:\program files\vagaa"这个路径. 这就需要字符串的替换 std::string full_path = "D:\\program files\\csdn" const size_t last_

实战c++中的vector系列--creating vector of local structure、vector of structs initialization

之前一直没有使用过vector<struct>,现在就写一个简短的代码: #include <vector> #include <iostream> int main() { struct st { int a; }; std::vector<st> v; v.resize(4); for (std::vector<st>::size_type i = 0; i < v.size(); i++) { v.operator[](i).a =

实战c++中的string系列--string的分割、替换(类似string.split或是explode())

对一个字符串根据某个字符进行分割也是在实战中经常遇到的问题,也是面试中经常会被人提及的. 如果你是个C Sharp程序员,你会知晓string.split函数,有下面这些重载: 1) public string[] Split(params char[] separator) 2) public string[] Split(char[] separator, int count) 3) public string[] Split(char[] separator, StringSplitOpt

实战c++中的string系列--string的遍历(使用下标还是iterator)

迭代器提供了访问容器中对象的方法.例如,可以使用一对迭代器指定list或vector中的一定范围的对象.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象. 我们都知道可以用下标运算来访问string对象和vector对象.而另外还有一种更通用的方法也可以实现这样的方法.名曰:迭代器(iterator). 类似于指针,迭代器也提供了对对象的间接访问.就迭代器而言,其对象是容器中的元素或者strin

实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样. 这就看到了吧,返回值是const char*,这里须要注意一下. 1 string转const char* 当然是用到上面所述的方法c_str(): string s1 = "abcdeg"; const char *k =