map<string, string> почему возникает ошибка?

241
14 марта 2017, 15:54

Лог:

c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\bits\stl_tree.h: In instantiation of 'void std::_Rb_tree::_M_insert_unique(_II, _II) [with _InputIterator = std::__cxx11::basic_string; _Key = std::__cxx11::basic_string; _Val = std::pair, std::__cxx11::basic_string >; _KeyOfValue = std::_Select1st, std::__cxx11::basic_string > >; _Compare = std::less >; _Alloc = std::allocator, std::__cxx11::basic_string > >]':

Код:

#include <iostream>
#include <string>
#include <iterator>
#include <map>
using namespace std;
int main()
{
    int n;
    cin >> n;
    map <string, string> human;
    string keyword, login, password, sLoggedIn;
    for (int i = 0; i < n; i++)
    {
        cin >> keyword >> login >> password;
        if (keyword == "register")
        {
            for (auto iter = human.begin(); iter != human.end(); ++iter)
            {
                if (iter->first != login)
                {
                    human.insert(login, password);
                    cout << "success: new user added";
                }
                else
                {
                    cout << "fail: user already exists";
                }
            }
        }
        if (keyword == "login")
        {
            for (auto iter = human.begin(); iter != human.end(); ++iter)
            {
                if (iter->first == login)
                {
                    if (password == iter ->second)
                    {
                        if (sLoggedIn == login)
                            cout << "fail: already logged in";
                        else
                            cout << "success: user logged in";
                        sLoggedIn = login;
                    }
                    else
                    {
                        cout << "fail: incorrect password";
                    }
                }
                else
                {
                    cout << "fail: no such user";
                }
            }
        }
        if (keyword ==  "logout")
        {
            for (auto iter = human.begin(); iter != human.end(); ++iter)
            {
                if (iter->first == login)
                {
                    if (sLoggedIn == login)
                    {
                        cout << "success: user logged out";
                        sLoggedIn = " ";
                    }
                    else
                    {
                        cout << "fail: already logged out";
                    }
                }
                else
                {
                    cout << "fail: no such user";
                }
            }
        }
    }
}
Answer 1
human.insert(login, password);

замените на

human[login] = password;

Или, если уж позарез нужен insert, то на

human.insert(make_pair(login, password));

См. описание map::insert: http://en.cppreference.com/w/cpp/container/map/insert

Answer 2

Логика вашего кода бессмысленна чуть менее чем полностью. Зачем вы выполняете цикл по каждому элементу human и пытаетесь создавать новую запись после проверки каждого отдельного элемента? Если вам нужно проверять, существует ли уже такой пользователь, то std::map для того и создан, чтобы вам не нужно было выписывать подобных циклов вообще.

Что касается синтаксиса добавления элемента в human, то именно в вашем синтаксисе правильной функцией является emplace, а не insert

human.emplace(login, password);

Обратите внимание, что если в вашем варианте кода вместо insert или emplace вы используете синтаксис

human[login] = password;

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

READ ALSO
Ошибка при компиляции в Code::Blocks

Ошибка при компиляции в Code::Blocks

Установил Code::Blocks 1601; запускаю любой проект- выдает ошибку!Выскакивают следующие окна: после нажатия собрать и запустить

245
Исключения С++ деление на ноль

Исключения С++ деление на ноль

Дошел до темы исключения в С++Такой вопрос, как задать исключение деление на 0? Если инструкция не работает

244
Проблема: Ко всем числам второго вектора добавляется последняя цифра из первого вектора

Проблема: Ко всем числам второго вектора добавляется последняя цифра из первого вектора

В общем, мне надо сделать программу с длинной арифметикойПроблема появилась на этапе считывания и переворота массива

224
Проверка графа на цикл

Проверка графа на цикл

Дан ориентированный граф, нужно проверить есть ли в нем циклВершин до 10^5, поэтому дфс с рекурсией не зайдет

263