2012-12-29 48 views
2

這是我第一次使用對,完全困惑。 如何初始化一對以將其插入地圖?
我應該爲此包含一些標準庫嗎?標準對初始化

#include <string> 
#include <map> 
using namespace std; 
class Roads 
{ 
public: 
    map< pair<string,string>, int > Road_map; 
    void AddRoad(string s, string d) 
     { int b = 2 ; Road_map.insert(pair<s,d>, b) ; } //pair<s,d> is wrong here. 

}; 

回答

4

您可以使用std::make_pair

Road_map[make_pair(s, d)] = b; 

或者,您可以像這樣構造std::pair

Road_map[pair<string,string>(s,d)] = b; 

std::make_pair方法可以讓您不必指定sd的類型。

請注意,此處適當的功能是operator[]而不是insertstd::map::insert採用一個參數,它是一個std::pair,其中包含您要插入的鍵和值。你將不得不是這樣做的:

Road_map.insert(pair<const pair<string,string>, int>(make_pair(s, d), b); 

你可以用typedef漂亮這一點:

typedef map<pair<string,string>, int> map_type; 
Road_map.insert(map_type::value_type(map_type::key_type(s, d), b)); 
3

改爲使用std::make_pair。像這樣:

#include <string> 
using namespace std; 
class Roads 
{ 
public: 
    map< pair<string,string>, int > Road_map; 
    void AddRoad(string s, string d) 
    { 
     int b = 2 ; 
     Road_map[make_pair(s,d)] = b; 
    } 

}; 
+1

我要去瘋了還是因爲'insert'應該採取將這個不行'value_type'單個參數(與鍵和值對)?沒有帶有鍵和值參數的「插入」。 –

+0

這沒有奏效。它給出了以下錯誤:不能將參數1從'std :: pair <_Ty1,_Ty2>'轉換爲'std :: _樹<_Traits> :: const_iterator' 我應該在這種情況下使用什麼? – Ever

+0

@sftrabbit你是對的。有趣的是,我沒有看清楚它。 – Rapptz

1

對於map<K, T>,該value_type實際上是pair<K const, T>。但是,要訪問這個最簡單的方法是使用類型定義:

typedef std::pair<std::string, std::string> string_pair; 
typedef std::map<string_pair, int>    map_type; 

// ... 

Road_map.insert(map_type::value_type(map_type::key_type(s, d), b)); 

在C++ 11可以使用更容易emplace接口:

Road_map.emplace(map_type::key_type(s, d), b);