C ++. Использование .find () со структурой в качестве ключа в карте - PullRequest
4 голосов
/ 14 апреля 2011

Все, у меня нет доступа к BOOST или STL, моя структура и карта выглядят примерно так: psuedo:

 struct s_map_key{
    int a;
    int b;
    bool operator<(const s_map_key& smk) const 
    {
        if (a < smk.a)       
        {            
            return true;
        } else if (a == smk.a)  
        { 
            if (b < smk.b) 
            { 
                return true;
            } 
            else if (b == smk.b)
            {
                return true;
            }
        } 
            return false;
    }
};

int main(int argc, char* argv[])
{

    std::multimap<s_map_key, std::string> myMap;
    for(int i = 0; i <10; i++)
    {
    s_map_key smk;
    smk.a = i;
    smk.b = 2;
    myMap.insert(std::make_pair(smk, "test"));
    }

    s_map_key smk;
    smk.a = 3;
    std::multimap<s_map_key, std::string>::iterator x = myMap.find(smk);
    if(x != myMap.end())
    {
        std::cout << x->first.a <<std::endl;
        std::cout << x->first.b <<std::endl;
    }
    return 0;
}

То, что я пытаюсь сделать, - это искать в моей мультикарте все случаи, когда A = 2, B = 2 или A & B = 2. Я не совсем уверен, но, думаю, мне нужно создать предикаты в моей структуре для "нахождения". Идеи?

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

operator< - это все, что вам нужно для find или чего-либо еще. Однако в вашей реализации есть ошибка. Возвращает true, если операнды равны.

find и другие компоненты стандартной библиотеки используют допущение, что a == b iff ! (a < b) && ! (b < a), поэтому, если a и b равны, < должно быть false, чтобы find работал.

        else if (b == smk.b)
        {
            return false; // was true
        }
0 голосов
/ 14 апреля 2011

Если вы не хотите установить эквивалентность 2 == smk if (smk.a == 2 || smk.b == 2 || smk.a & smk.b == 2), я предлагаю сделать предикат внешний и использующий std :: find_if. Если вы сделаете его частью структуры, чтобы вы могли использовать внутреннюю функцию поиска multimap, вы могли бы открыть дверь для предиката, который нежелательно использовался другим кодировщиком. Кроме того, внутренняя функция поиска будет возвращать только первый соответствующий экземпляр, тогда как с помощью std :: find_if вы можете обновить свою начальную точку, чтобы найти все экземпляры. Если вы хотите использовать внутренние функции, вам нужно вместо этого использовать equal_range.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...