вставка в std :: map вызывает ошибку.Ключ является std :: pair, а значение является коротким - PullRequest
0 голосов
/ 30 мая 2019
#include <iostream>
#include <map>
#include <utility>
int main()
    {
        std::pair<std::string, std::string> p;
        std::map< std::pair<std::string, std::string>, short> m;
       // p = std::make_pair("A", "a1");
        m.insert(std::make_pair("A", "a1"), 10);
        return 0;
    }

Этот код выдает следующую ошибку

maptest.cpp: In function ‘int main()’:
maptest.cpp:9: error: no matching function for call to 
‘std::map<std::pair<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, short int, 
std::less<std::pair<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > > >, std::allocator<std::pair<const 
std::pair<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, short int> > >::insert(std::pair<const char*, 
const char*>, int)’

Я пытаюсь вставить стандартную карту. KWY - это стандартная пара, а значение - короткое. Но я получаю вышеупомянутую ошибку. Что я здесь не так делаю? Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Функция вставки принимает пару. Вам нужно

 m.insert(std::make_pair(std::make_pair("A", "a1"), 10));

Кроме того, вы можете использовать функцию emplace :

 m.emplace(std::make_pair("A", "a1"), 10);

В качестве примечания, в простом языке программистов слово «throw» имеет конкретное значение, относящееся к исключениям. В вашем случае вы просто получаете ошибку компиляции.

0 голосов
/ 30 мая 2019

Просто не существует метода вставки с аргументами ключ и значение, т.е. map<...>::insert(K key, V value). Вместо этого он принимает пару ключ-значение, поэтому этот код должен работать:

#include <iostream>
#include <map>
#include <utility>
int main()
{
        std::pair<std::string, std::string> p;
        std::map< std::pair<std::string, std::string>, short> m;

        auto&& key = std::make_pair("A", "a1");
        short value = 10;
        auto&& key_value_pair = std::make_pair(key, value);
        //Structured bindings are c++17
        auto&&[IT, wasInserted] = m.insert(key_value_pair);

        return 0;
}

Я бы рекомендовал использовать метод C ++ 17 try_emplace, который имеет аргументы ключа и значения:

auto&&[IT, wasInserted] = m.try_emplace(key, value);  
...