2016-11-03 2 views
1

Я новичок в использовании карт и мультиплексов, и у меня возникают проблемы (ошибки и предупреждения компилятора) при попытке вставить 3 значения в мультимап с помощью пара строк (действующих в качестве ключа) и целочисленное значение:C++ - Вставка трех значений переменных в мультимаг.

Это моя MultiMap декларация:

multimap<pair<string, string>, int> wordpairs; 

Это, как я пытаюсь заполнить Multimap:

int toInsert = 0; 

    for (int i = 0; i < s; i++) { 

    wordpairs.insert((words[i], words[i+1]), toInsert); 

    } 

где слова:

vector<string> words 

Я получаю эту ошибку и кучу предупреждений:

error: no matching function for call to ‘std::multimap<std::pair<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >, int>::insert(std::__cxx11::basic_string<char>&, int&)’ 
    wordpairs.insert((words[i], words[i+1]), toInsert); 
                ^

Не знаю, как правильно вставить значения я хочу. :(

ответ

0

Вы должны использовать это wordpairs.insert(make_pair(make_pair(words[i], words[i+1]), toInsert));

+0

Это сработало! Спасибо!: D – RockAndaHardPlace

+0

В этой ситуации emplace имеет больше смысла. – RyanP

+0

Я получил немного менее подробный вариант с этим, хотя ему нужен C++ 11: 'wordpairs. emplace (std :: make_pair (слова [i], слова [i + 1]), toInsert); – Xirema

1

Ваш ключ является пара (pair<string, string>) и (words[i], words[i+j]) не пара Вам нужно wordpairs.emplace(std::make_pair(words[i], words[i+j]), toInsert)

Edit:. Есть два способа, чтобы положить что-то в карту (или Multimap) Первое. вставьте, в которой ему нужен объект для копирования на вашу карту. Ваша карта содержит пару < пару < string, string>, int>. Таким образом, вы можете вызвать insert like ... wordpairs.insert(std::make_pair(std::make_pair(words[i], words[i+j]), toInsert)) ИЛИ вы можете их заменить. Emplace создает объект на месте, поэтому вместо того, чтобы конструировать его с помощью make_pair, а затем скопировать его на карту, вы можете просто построить его на месте с данным вызовом.

+0

Я попробовал это, и я все еще получаю ту же ошибку. :( – RockAndaHardPlace

+0

Моя ошибка, я отредактирую – RyanP

1

insert member function только ожидает один аргумент.

wordpairs.insert((words[i], words[i+1]), toInsert); 

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

Вкладыш ожидает пару, {ключ, значение}, Ваш ключ является парой {слов [I], слова [+ 1]} в сочетании это дает с магией равномерной инициализации:

wordpairs.insert({{words[i], words[i+1]}, toInsert}); 

Для этого требуется C++ 11.

Дополнительное чтение, почему это работает, находится в a very popular softwareengineering question.

Смежные вопросы