C++ поиск совпадения ключ-значения в map

140
23 июля 2021, 08:10

Вечер добрый! Есть std::map myMap, который я заполнил из file.txt файла(заполнился и отображается корректно) 1 qwerty 2 sef 3 hhhh

Далее я от пользователя принимаю значения инт id1 и стринг name1 и хочу их сравнить на совпадение пары в myMap. Если коротко, то у меня не получилось это сделать нормально. Как это сделать корректно?

Answer 1
bool
my_cmp(const std::map<int, std::string>& m,
    const std::pair<int, std::string>& p)
{   
    auto It =m.find(p.first);
    return (It !=  m.end()) && (It->second == p.second);
}
int main() {    
    std::map<int, std::string> Mymap{ {1, "qwerty"} /*...*/};
    std::cout  << std::boolalpha
               << my_cmp(Mymap, { 1, "qwerty" });
    return 0;
}
Answer 2

А если компилятор умеет С++17, то можно одной строкой:

bool my_cmp(const std::map<int, std::string>& m,
            const std::pair<int, std::string>& p)  {
    if (auto It = m.find(p.first); It !=  m.end() && It->second == p.second) return true;
    return false;
    }
Answer 3

В итоге я сделал так: создал ф-ю, которая принимает две инициализированные карты(одна подкачана из файла.тхт и имеет множество пар-ключей "1 qwer, и тд...", вторая же принята от пользователя и содержит одну пару "2 qws"), пробегается по обоим и сравнивает на совпадение пар-ключей. Хз что с оптимизацией, но сравнение проходит четко.

void my_cmp(std::map<int, std::string>& r, std::map<int, std::string>& p)
{
    std::map<int, std::string>::iterator i = p.begin(); i != p.end();
    std::map<int, std::string>::iterator ri = r.begin(); ri != r.end();
    int bil = 0;
    for (ri; ri != r.end(); ++ri)
    {
        for (i; i != p.end(); ++i) {
            if ((i->second) == (ri->second) && (i->first) == (ri->first)) {
                if ((i->second) == (ri->second) && (i->first) == (ri->first)) {
                    bil = 1;
                }
            }
        }
    }
    if (bil==1) {
        std::cout << "Entering allowed" << std::endl;
        std::cout << "____________________________" << std::endl;
        std::cout << std::endl;
    }
    else {
        std::cout << "Entering not allowed" << std::endl;
        std::cout << "____________________________" << std::endl;
        std::cout << std::endl;
    }
}
READ ALSO
Не могу создать структуру

Не могу создать структуру

Не могу создать переменную структуруЕсли мы объявляем структуру в том же файле где и main функция, то все инициализируется нормально

451
Удаление Sprite со сцены cocos2d-x

Удаление Sprite со сцены cocos2d-x

При удалении спрайта функциями this->removeChild(sprite,true); или this->removeChildByTag(1) или sprite->removeFromParent(); вылетает играВ чём заключается проблема? Вроде...

223
Нужен SD_SEND для UDP соединения?

Нужен SD_SEND для UDP соединения?

Есть такой код, как я понял он полностью отключает соединения, мне интересно для чего его используют в UDP сетиИли его вообще не используют...

267
Как передать указатель в другую функцию с++?

Как передать указатель в другую функцию с++?

В С++ я полный ноль, начал изучать по нужде буквально сутки назадЕсть проблема

226