C ++, как проверить, существует ли заданный вход в векторе пар? - PullRequest
1 голос
/ 12 октября 2019

Существует простая телефонная книга с содержанием, приведенным в векторе. Программа должна попросить пользователя ввести имя и представить номер, если он существует, и предупредить в противном случае. И это должно оставить телефонную книгу с выходом. Я получаю сообщение об ошибке для части итератора. Как я могу это исправить?

Я создал итератор для этой цели: vector <pair < string , string >>::iterator it; однако я получаю сообщение об ошибке: invalid operands to binary expression ('std::__1::pair<std::__1::basic_string<char>, std::__1::basic_string<char> >' and 'const std::__1::basic_string<char>')

int main()
{
    //phone book
    vector <pair < string , string >>
    vec { make_pair ("Homer", "1111"),
    make_pair ("Marge", "2222"),
    make_pair ("Lisa", "3333"),
    make_pair ("Magy", "4444"),
    make_pair ("Bart", "5555")};

    std::string nameEntered;
    vector <pair < string , string >>::iterator it; //create iterator

    //unless Exit entered;
    while(nameEntered != "Exit"){

            //take input from user
            cout<<"Enter name (or Exit ): ";
            std::cin >> nameEntered; 

            it = std::find(vec.begin(), vec.end(), nameEntered);
            //if given input exists, returns the corresponding phone number
            if(it != vec.end()){

            std::cout << "Phone number is: " << (*it).second << endl; //displays the phone number for given input name

            }

            else{

                std::cout << "No such phone number!"; //warns the user
            }
    }
}

Я получаю сообщение об ошибке: invalid operands to binary expression ('std::__1::pair<std::__1::basic_string<char>, std::__1::basic_string<char> >' and 'const std::__1::basic_string<char>'). Ожидаемый результат - номер телефона с заданным именем ввода.

1 Ответ

1 голос
/ 12 октября 2019

Вместо этого используйте

it = std::find_if( vec.begin(), vec.end(), 
                   [&nameEntered]( const auto &p ) { return p.first == nameEntered; } );

В противном случае вы пытаетесь сравнить объект типа std::pair<std::string, std::string> с объектом типа std::string, как говорится в сообщении об ошибке.

Payобратите внимание на то, что условие цикла не является хорошим.

while(nameEntered != "Exit"){

        //take input from user
        cout<<"Enter name (or Exit ): ";
        std::cin >> nameEntered; 
        //...

, поскольку при вызове алгоритма будет использоваться строка "Exit".

...