Stl List Find

리스트에 구조체를 입력할때 검색하는 방법에 대해서 알아보자.

필요한 헤더 파일

#include <string>
#include <list>
#include <algorithm>
#include <functional>

Item 구조체

struct Item
{
    std::string _name;
    float _price;

    Item(std::string name, float price)
    {
        _name = name;
        _price = price;
    }

    bool operator==(const Item& n) const
    {
        if (this->_name.compare( n._name) == 0)
            return true;
        else
            return false;
    }
};

typedef std::list<Item> ItemList;

리스트 초기화

    ItemList list = { Item("sword1", 100)
        , Item("sword2", 200)
        , Item("sword3", 300)
        , Item("sword4", 400)
    };

find_if와 람다를 이용한 방식

    std::string key = "sword3";
   
    auto it = std::find_if(list.begin(), list.end(), [&key](Item const& item) -> bool {
        return item._name.compare(key) == 0;
    });
   
    if (it != list.end())
        std::cout << key << " : " << it->_price << std::endl;

find_if와 comparator를 이용한 방식

bool CompareName(Item& item, std::string key)
{
    if (item._name.compare(key) == 0)
        return true;
    else
        return false;
}


auto it2 = std::find_if(list.begin(), list.end(), std::bind(CompareName, std::placeholders::_1, "sword4"));
    if (it2 != list.end())
        std::cout << it2->_name << " : " << it2->_price << std::endl;

std::find와== operator를 이용한 방식

struct Item
{
    std::string _name;
    float _price;

    Item(std::string name, float price)
    {
        _name = name;
        _price = price;
    }

    bool operator==(const Item& n) const
    {
        if (this->_name.compare( n._name) == 0)
            return true;
        else
            return false;
    }
};

typedef std::list<Item> ItemList;

void main()
{
    auto it1 = std::find(list.begin(), list.end(), Item("sword4", 0));

    if (it1 != list.end())
        std::cout << it1->_name << " : " << it1->_price << std::endl;
}

여러가지 list 출력

    for (const Item& item : list)
    {
        std::cout << "item._name" << " : " << item._name << std::endl;
    }

    std::for_each(list.begin(), list.end(), [](const Item& item)
    {
        std::cout << "item._name" << " : " << item._name << std::endl;
    });