C ++ std :: map :: iterator什么都没找到,但是下标运算符返回对映射值的引用?

时间:2016-10-22 02:34:31

标签: c++ stl stdmap

可能做一些非常愚蠢的事情,但我无法弄清楚为什么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...

2 个答案:

答案 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();
}

如果你写了一个<错误,你就会得到一种疯狂的行为。