2012-07-13 17 views

回答

2

map::operator[]將密鑰插入到映射中,如果沒有,則使用默認值。

如果你不希望出現這種情況:

std::map<string, string>::iterator it = m.find("asdf"); 
//if you use C++11: 
//auto it = m.find("asdf"); 
if (it == m.end()) 
    std::cout << "Not found" << std::endl; 
else 
    std::cout << "The value is " << *it << std::endl; 

map::operator[]是對很多事情,特別是參考有用。例如:

std::string &x = m["asdf"]; 
x += "X"; 

這會將"X"添加到地圖中的(可能是新創建的)字符串中。

1

x將是默認構造的std :: string。當編譯operator []時,std :: map需要一個默認構造函數。

+2

我想你的意思是默認的構造函數。除非使用'std :: map :: operator []',否則'std :: map'不需要默認構造函數。 – 2012-07-13 07:19:33

2

然後,我不能通過查看x來確定是否在地圖中。那是對的嗎?

你說得對。它將被默認構建以防萬一它丟失。

你應該使用m.count("asdf")(只是找出它是否存在)或m.find("asdf")(加上,如果它存在的話,請參考)來找出它是否存在。取決於您的要求。

+0

將「默認構造」結果爲空字符串?在我的情況下,我得到一些隨機值,有時訪問衝突,這取決於我如何處理返回的值。這是Microsoft C++。 – 2012-07-13 07:19:53

+0

+1儘管我最終決定接受rodrigo的答案,儘管你直接回答我的問題。這兩個答案對我來說同樣有幫助,但是rodrigo的例子給那些不知道如何使用'find'的人提供了一些例子,我總是發現它很有幫助。 Otoh,你在那裏提到'count' ... – 2012-07-13 07:25:34

+0

我知道,這是我來自的網站。儘管如此,它並沒有討論字符串的默認構造函數。 http://www.cplusplus.com/reference/string/string/string/說'字符串()內容被初始化爲一個空字符串。「這似乎並沒有發生在我的情況... – 2012-07-13 07:28:30

0

首先,運算符[]將構造'值'對象,如果缺少使用值初始化而不是默認構造函數。這意味着在適當的地方使用默認的構造函數,併爲內置類型(int,float,指針)使用零初始化,併爲聚合(如簡單結構)進行遞歸值初始化。

你說的對,如果你從operator []獲得一個值構造的對象,你將不知道它是否存在於地圖中,或者它是否在飛行中生成。 operator []的另一個問題是它不是一個const成員。

儘管如此,操作員有時也很有用。例如,如果我使用地圖來存儲一些文字的字數,則

unsigned countCats(std::map<std::string, unsigned> dict) 
{ 
    unsigned count = disc["cat"]; 
} 

操作員的工作原理與您的預期完全相同。

相關問題