2016-10-22 59 views
0

可能做了一些非常愚蠢的事情,但我不明白爲什麼find找不到與suppID等效的密鑰。C++ std :: map :: iterator什麼也沒找到,但下標運算符返回對映射值的引用?

但是,當我通過下標運算符suppID時,它返回對其映射值的引用(意味着它找到了某些東西,對嗎?)。

typedef std::map<SuppID, Supplement *> Supplement_t; 

Supplement_t::iterator it = supplements.find(suppID); //it = supplements.end() 

cout << "Supplement name: " << supplements[suppID]->getName() << endl; // "Cytogainer" 
... // Returns few of many other data members I tested... 
+2

讓我猜,'SuppID'是一個複雜的類型,你自己編寫了一個'<'。 – Yakk

+0

@Yakk正確。這個提示讓我進一步閱讀,發現所有元素都需要自反地返回錯誤。目前他們沒有,所以我認爲確實是這個問題。 –

回答

1

當爲關聯容器編寫<時,很容易出錯。

簡單的方法是編寫一個函數或方法返回一個元組,無論是引用或值或混合。撥打電話foo

friend bool operator<(self const& lhs, self const& rhs){ 
    return lhs.foo()<rhs.foo(); 
} 

如果你寫了一個<錯誤,你會得到簡單的瘋狂行爲。

2

這是因爲std::map插入使用下標操作時還不存在的新鍵值的默認值。

如上所述here

1)插入VALUE_TYPE(鍵,T())如果鍵不存在。這個函數相當於返回插入(std :: make_pair(key,T()))。first-> second; -key_type必須符合CopyConstructible的要求。 -mapped_type必須符合CopyConstructible和DefaultConstructible的要求。 如果執行插入操作,則映射的值將進行值初始化(默認爲類類型構造,否則爲0初始化),並返回對其的引用。

+0

我也讀過,但它沒有顯示該元素是使用其默認構造函數構造的。因此'Supplement *'的'getName()'返回''cytogainer'''而不是''默認蛋白質震動''。很困惑。 –

+0

@lolololol那麼,我不能從那個狹窄的樣本中判斷你爲什麼會發生這種情況。 –

相關問題