2009-11-01 125 views
1

只是一個快速的語法問題。我正在寫地圖課(學校)。C++運算符[]語法

如果我定義了以下運算符重載:

template<typename Key, typename Val> class Map {... 
Val* operator[](Key k); 

會發生什麼事,當一個用戶寫道:

Map<int,int> myMap; 
map[10] = 3; 

做這樣的事情,只有將覆蓋[空]指針的臨時副本鍵k。是否有可能這樣做:

map[10] = 3; 
printf("%i\n", map[10]); 

具有相同的運算符過載?

回答

5

它與std::map一起工作的方式是,如果該鍵不存在,映射類將插入一個默認值,然後返回一個左值(一個可分配的與該鍵關聯的值的引用),因此它可以被分配一個新的值。

所以,下面的代碼示例中,假設map是空的,這將插入10到地圖中,並用3

map[10] = 3; 

的值與您的自定義地圖類,operator[]應先檢查相關聯如果Key k存在,如果不存在,則將新的鍵/值對(使用typename Val的默認構造函數)插入到映射中。然後,您可以返回對與新密鑰關聯的值的引用,以便用戶可以爲其分配值。請注意,這意味着Val必須是Assignable並且具有默認構造函數。

這允許operator[]用於插入和查找。您還應該重載operator[]const版本,這當然只支持查找。

編輯:我現在注意到你的代碼中你正在返回一個指針。如果你想使用std :: map使用的插入/查找範例operator[],那麼返回一個引用會更有意義。返回一個指針給你的好處是你可以檢查NULL的返回值operator[]以檢查密鑰是否不存在,但是,如果你想要operator[]同時提供查找和插入功能,參考將是到這裏。

+0

所以我應該定義我的超載爲 Val&operator [](Key k);並且確保我適當地進行初始化,即使這裏沒有任何東西。 – mamidon 2009-11-02 00:04:17

+0

這是正確的。 – 2009-11-02 00:06:24

+0

謝謝一堆;即使不是'需要',我也必須製造物體。 – mamidon 2009-11-02 00:09:38