2016-12-25 126 views
1

對於像<int, vector<vector<int>>>這樣的pair類型使用unordered_map是否合法?沒有函數模板「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():你應該有這樣的Visual Studio警告我的std :: make_pair「函數模板沒有實例 「中第16行參數列表」(map.insert(make_pair<int, vector<vector<int>>>(i + m, tt)))匹配模板推斷適當的類型:

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&',非''const'左值可以綁定到'X&'。參數'tt'是'std :: vector >'類型的非'constst'左值。你也可以在'&前面加一個'const',但在這種情況下不需要。 ......並且最好將這些類型關閉! –

1

你不應該給類型參數傳遞給make_pair;它應該推斷出它們,然後將它們轉發給一對值。

只需在make_pair之後刪除<int, vector<vector<int>>>部分。

你可以傳遞類型並使其工作,但規則是神祕的,而且程序是無用的;通過傳遞類型,你做錯了。

如果您想要傳遞類型,請將make_pair替換爲pair並直接構造。 make_pair的點是而不是必須通過類型。

如果您想了解有關此特定錯誤的更多信息以及make對的工作方式,請閱讀有關模板函數類型推導和轉發參考的信息。

相關問題