說我有一個地圖語句「x = map [keyPotentiallyNotYetInMap]」對任何事都有用嗎?
map<string, string> m;
,並做了
string x = m["asdf"];
不知道如果 「ASDF」 是在地圖與否。然後,我不能通過查看x
來確定它是否在地圖中。那是對的嗎?
所以我應該先做一個m.first(asdf)
來解決這個問題。
說我有一個地圖語句「x = map [keyPotentiallyNotYetInMap]」對任何事都有用嗎?
map<string, string> m;
,並做了
string x = m["asdf"];
不知道如果 「ASDF」 是在地圖與否。然後,我不能通過查看x
來確定它是否在地圖中。那是對的嗎?
所以我應該先做一個m.first(asdf)
來解決這個問題。
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"
添加到地圖中的(可能是新創建的)字符串中。
x將是默認構造的std :: string。當編譯operator []時,std :: map需要一個默認構造函數。
然後,我不能通過查看x來確定是否在地圖中。那是對的嗎?
你說得對。它將被默認構建以防萬一它丟失。
你應該使用m.count("asdf")
(只是找出它是否存在)或m.find("asdf")
(加上,如果它存在的話,請參考)來找出它是否存在。取決於您的要求。
將「默認構造」結果爲空字符串?在我的情況下,我得到一些隨機值,有時訪問衝突,這取決於我如何處理返回的值。這是Microsoft C++。 – 2012-07-13 07:19:53
+1儘管我最終決定接受rodrigo的答案,儘管你直接回答我的問題。這兩個答案對我來說同樣有幫助,但是rodrigo的例子給那些不知道如何使用'find'的人提供了一些例子,我總是發現它很有幫助。 Otoh,你在那裏提到'count' ... – 2012-07-13 07:25:34
我知道,這是我來自的網站。儘管如此,它並沒有討論字符串的默認構造函數。 http://www.cplusplus.com/reference/string/string/string/說'字符串()內容被初始化爲一個空字符串。「這似乎並沒有發生在我的情況... – 2012-07-13 07:28:30
首先,運算符[]將構造'值'對象,如果缺少使用值初始化而不是默認構造函數。這意味着在適當的地方使用默認的構造函數,併爲內置類型(int,float,指針)使用零初始化,併爲聚合(如簡單結構)進行遞歸值初始化。
你說的對,如果你從operator []獲得一個值構造的對象,你將不知道它是否存在於地圖中,或者它是否在飛行中生成。 operator []的另一個問題是它不是一個const成員。
儘管如此,操作員有時也很有用。例如,如果我使用地圖來存儲一些文字的字數,則
unsigned countCats(std::map<std::string, unsigned> dict)
{
unsigned count = disc["cat"];
}
操作員的工作原理與您的預期完全相同。
我想你的意思是默認的構造函數。除非使用'std :: map :: operator []',否則'std :: map'不需要默認構造函數。 – 2012-07-13 07:19:33