可能做一些非常愚蠢的事情,但我无法弄清楚为什么find
找不到一个等同于suppID
的密钥的元素。
然而,当我传递下标运算符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...
答案 0 :(得分:2)
这是因为std::map
为使用下标运算符时尚不存在的新键值插入了默认值。
如上所述here:
1)如果密钥不存在,则插入value_type(key,T())。此函数等效于返回插入(std :: make_pair(key,T()))。first-&gt; second; -key_type必须满足CopyConstructible的要求。 -mapped_type必须满足CopyConstructible和DefaultConstructible的要求。 如果执行插入,则映射值是值初始化的(默认为类类型构造,否则为零初始化),并返回对它的引用。
答案 1 :(得分:1)
为关联容器编写<
时,很容易弄错。
简单的方法是编写一个返回元组的函数或方法,无论是引用还是值或混合。如果foo
,请致电。
friend bool operator<( self const& lhs, self const& rhs ){
return lhs.foo()<rhs.foo();
}
如果你写了一个<
错误,你就会得到一种疯狂的行为。