2016-12-25 7 views
1

Можно ли использовать unordered_map для типа пары, например <int, vector<vector<int>>>? Visual Studio предупреждает меня «Нет экземпляр шаблона функции„станд :: make_pair не совпадает со списком аргументов“в строке 16 (map.insert(make_pair<int, vector<vector<int>>>(i + m, tt))):Нет экземпляра шаблона функции «std :: make_pair» соответствует списку аргументов

void test(vector<int>& nums) 
{ 
    unordered_map<int, vector<vector<int>>> map; 
    unordered_map<int, unordered_set<int>> map2; 
    vector<vector<int>> results; 

    for (int i = 0; i < nums.size(); i++) 
    { 
     for (int m = i + 1; m < nums.size(); m++) 
     { 
      if (!map.count(i + m)) 
      { 
       vector<int> t{ i, m }; 
       vector<vector<int>> tt; 
       tt.push_back(t); 
       map.insert(make_pair<int, vector<vector<int>>>(i + m, tt)); 
       map2.insert(make_pair<int, unordered_set<int>>(i + m, unordered_set<int>(i - m))); 
      } 
      else if (map2.at(i + m).count(i - m) || map2.at(i + m).count(m - i)) 
      { 
       continue; 
      } 
      else 
      { 
       map.at(i + m).push_back(vector<int>{i, m}); 
       map2.at(i + m).insert(i - m); 
      } 
     } 
    } 

}

ответ

5

Проблема, кажется, std::make_pair(): вы должны иметь это шаблон вывести соответствующие типы:

map.insert(std::make_pair(i + m, tt)); 

Согласно C++ стандарт 20.3.3 [pair.spec] пункт 9 std::make_pair() объявлен что-то вроде этого:

template <typename F, typename S> 
std::pair<???, ???> make_pair(F&& first, S&& second) 

(с подходящими типами, заполненными для ???). Однако, типы, которые вы указали, не соответствуют аргументам! Если вы хотите, чтобы правильно определить типы, вы будете использовать

std::make_pair<int, std::vector<std::vector<int>>&>(i + m, tt) 
+0

действительно так, поскольку C++ 11. http://en.cppreference.com/w/cpp/utility/pair/make_pair –

+0

Почему именно 'std :: vector >>' требуется, чтобы быть ссылкой для правильного соответствия типов? – SebNag

+1

@SebTu: параметры шаблона задаются с помощью ссылки пересылки (тип которой предназначен для вывода). Когда тип указан явно, он объединяется с '&&'. Это при использовании 'X' для типа у вас будет параметр типа' X && ', к которому могут привязываться только rvalues. Использование 'X &' дает 'X & &&', который становится 'X & 'после обращения коллапса, к которому могут привязываться не-константы lvalues. Параметр 'tt' является неконвертом lvalue типа' std :: vector > '. Вы также можете добавить 'const' перед' & ', но в этом случае это не обязательно. ... и лучше всего оставить свои типы! –

1

Вы не должны передавать аргументы типа в make_pair; предполагается их вывести, а затем переслать их в пару значений.

Просто удалите <int, vector<vector<int>>> после make_pair.

Вы можете передавать типы и заставить их работать, но правила тайны, а процедура бесполезна; пропуская типы, вы делаете это неправильно.

Если вы хотите сдать типы, замените make_pair на pair и постройте напрямую. Точкой make_pair является не, чтобы передать типы.

Если вы хотите узнать больше об этой конкретной ошибке и о том, как сделать работу пары, ознакомьтесь с информацией о выводе и перенаправлении типа шаблона.