c++ std::map::iterator一无所获,但下标操作符返回对映射值的引用

C++ std::map::iterator found nothing, yet subscript operator returns reference to mapped value?

本文关键字:返回 映射 引用 操作符 map std iterator 一无所获 c++ 下标      更新时间:2023-10-16

可能做了一些非常愚蠢的事情,但我不明白为什么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...

这是因为std::map在使用下标操作符时为尚不存在的新键值插入默认值。

如下所述:

1)如果键不存在,则插入value_type(key, T())。这个函数相当于return insert(std::make_pair(key, T())).first->second;-key_type必须满足CopyConstructible的要求。-mapped_type必须满足CopyConstructible和DefaultConstructible的要求。如果执行插入,则映射值为value-initialized(对于类类型为默认构造,否则为zero-initialized),并返回对它的引用。

在为关联容器编写<时,很容易出错。

简单的方法是编写一个函数或方法返回一个元组,元组可以是引用或值,也可以是混合元组。呼叫foo

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

如果你写错了<,你会得到疯狂的行为。