2012-07-27 33 views
1

這裏是我的問題的近似代碼。首先,我們有一個構造一個結構:調用struct函數的構造函數,C++

struct Pair{ 
Pair(int a, int b): (first (a) , second (b)) {} 
int first; 
int second; 
}; 

其在地圖中使用

map<string, Pair> mymap; 

我想在一個函數

void f(map<string, Pair>* mymap, string c,int x, int y) 
{ 
(*mymap)[c]=Pair(x,y); 
} 

但是編譯器初始化這個地圖首先說它找不到合適的構造函數,然後接下來的幾行是沒有爲構造函數提供足夠的參數。

我的一個朋友告訴我,我應該寫這樣的功能:

void f(map<string, Pair>& mymap, const string& c,int x, int y) 
{ 
    if (mymap.find(c) != mymap.end()) { 
    mymap[c] = Pair(x,y); 
    } 
} 

但他無法解釋爲何類型&應在此處使用的,而不是類型 *,和我想澄清這一點。有人可以解釋嗎?

+0

@philippe我看不出有什麼幫助。 – 2012-07-27 15:58:10

+1

1.你的朋友複製了一些已經假定在那裏的代碼。無論如何,地圖需要找到密鑰才能進行插入。 2.在這種情況下,引用或指針並不重要。 3.您需要運營商[]的默認ctor來運行 4.我太害怕以此作爲答案。所以可能還活着吃我。 – nurettin 2012-07-27 16:03:04

+0

@pwned:你不應該害怕,所以我會提高答案 - 我基本上也回答了這個問題。對不起,如果你以前有過不愉快的經歷,並希望能在短時間內得到一些答案:) – 2012-07-27 16:05:33

回答

3

的問題是,在operator[]地圖要求值類型是缺省構造的避免這種情況。如果你不想讓你的Pair是缺省構造的,你必須避免使用operator[]

void f(map<string, Pair>& mymap, string c,int x, int y) 
{ 
    mymap.insert(std::make_pair(c,Pair(x,y))); 
} 

你可能誤解了你的朋友建議什麼。 operator[]的問題不是它需要默認構造函數如果它需要創建一個新元素,但它需要它以防萬一它可能需要。也就是說,元素是否存在並不重要。


如果您也意味着更新,那麼你也需要考慮這個選項:

void f(map<string, Pair>& mymap, string c,int x, int y) 
{ 
    auto res = mymap.insert(std::make_pair(c,Pair(x,y))); 
    if (!res.second) 
     res.first->second = Pair(x,y); 
} 

基本上insert操作返回一對在關鍵指向迭代器,並表示如果這是一個布爾insert創建了該對象,或者它已經存在(在這種情況下,映射中的值是未修改的)。通過存儲結果,我們可以測試,如果insert沒有創建值,我們可以通過返回的迭代器更新它。

+0

我認爲這不會更新地圖中的元素,而他的最初想法可以做到這一點(例如,如果Pair具有默認的構造函數)。 – 2012-07-27 16:11:46

0

標準容器需要一個默認的構造函數。他們將使用operator=在施工後的某個時間點設置正確的值。

+1

無論如何,它需要一個'operator []'。他可以在C++ 11中使用'insert'甚至'emplace'。 – Xeo 2012-07-27 15:59:00

+0

@Xeo,我的意思是'operator ='被包含的類型,而不是容器本身。 – 2012-07-27 16:01:08

+0

他們沒有,真的..在這種情況下 - 不要實例化operator []'並且你沒有默認的構造函數就行了。 – 2012-07-27 16:12:34

2

在地圖上調用operator[]將需要您的類型爲默認可構造。您可以通過使用map::insertmap::emplace

+0

謝謝,我不知道這件事! – gartenzwerg 2012-07-27 16:19:17

2

您將需要一個默認contrructor:

Pair(): first() , second() {} 

這需要對地圖的operator[],它創建了一個缺省構造時,與不存在的密鑰 -

和一個叫 mapped_type 執行的小於運營商 strict weak ordering

struct Pair { 
    // as before 
    bool operator<(const Pair& rhs) const { 
    /some code to implement less-than 
    } 
}; 

或你可以傳遞一個比較仿函數或者功能實現爲嚴格的弱排序,作爲第三個模板參數 。

+0

對不起,我不明白爲什麼我需要在這裏訂購操作員? – gartenzwerg 2012-07-27 16:20:33

+0

我不相信你會這樣做。 – jahhaj 2012-07-27 17:20:35

+0

@gartenzwerg你不需要它,我的壞。你只需要訂購,如果你的類型是地圖的關鍵字,或者你想把它放在'std :: set'中 – juanchopanza 2012-07-28 07:16:47