Как инициализировать ключевое поле карты с помощью итератора? - PullRequest
0 голосов
/ 06 мая 2018
#include <iostream>
#include <map>
#include <string>

int main ()
{
    std::string s;
    std::cout<<" String : ";
    std::getline(std::cin,s);
    std::map<std::string,std::string> mapa;
    std::map<std::string,std::string>::iterator it(mapa.begin());
    it->first = s;
    it->second = s;
    std::cout << it->second << std::endl;
    return 0;
}

Почему я не могу инициализировать ключевое поле карты (it-> first = s не работает), но второе поле работает ?. И каково решение?

1 Ответ

0 голосов
/ 06 мая 2018

Почему я не могу инициализировать ключевое поле карты (it-> first = s не работа) но второе поле работает? И каково решение?

У вас есть ответ на сам вопрос. std::map сопоставляет ключ со значением. Это означает, что во время самого создания вам нужно установить и ключ (и значение).

it->first=s; Это не скомпилируется, потому что вы не упомянули, для чего нужен ключ.

it->second=s; Это UB. Так как вы не упомянули ключ с ним.

std :: map - это отсортированный ассоциативный контейнер, содержащий значение ключа пары с уникальными ключами. Ключи отсортированы с помощью сравнения Функция сравнения.

Следовательно, для того, чтобы сделать сравнение и поставить правильную позицию в структуре данных, ему нужны обе информации вместе.

Решения:

  • mapa[key] = value; с использованием (operator[]). Вы можете использовать то же самое для доступа к значениям на карте напрямую по соответствующему ключу.
  • mapa.emplace("key", "value");
  • mapa.insert ( std::pair<std::string, std::string>("key", "value") );
  • mapa.insert ( std::make_pair("key", "value") );
  • std::map<std::string,std::string>::iterator it(mapa.begin());
    mapa.insert (it, std::pair<std::string, std::string>("key", "value"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...