C++ C++;迭代器找不到任何内容,但下标运算符返回对映射值的引用?

C++ C++;迭代器找不到任何内容,但下标运算符返回对映射值的引用?,c++,stl,stdmap,C++,Stl,Stdmap,可能做了一些非常愚蠢的事情,但我不明白为什么find找不到一个键与suppID等价的元素 然而,当我传递下标操作符suppID时,它返回对其映射值的引用(这意味着它找到了什么,对吗?) typedef标准::地图补充; Supplement\u t::迭代器it=supplements.find(suppID)//it=supplements.end() cout这是因为std::map在使用下标运算符时为尚未存在的新键值插入默认值 如上所述: 1) 如果键不存在,则插入值类型(键,T())。此

可能做了一些非常愚蠢的事情,但我不明白为什么
find
找不到一个键与
suppID
等价的元素

然而,当我传递下标操作符
suppID
时,它返回对其映射值的引用(这意味着它找到了什么,对吗?)

typedef标准::地图补充;
Supplement\u t::迭代器it=supplements.find(suppID)//it=supplements.end()

cout这是因为
std::map
在使用下标运算符时为尚未存在的新键值插入默认值

如上所述:

1) 如果键不存在,则插入值类型(键,T())。此函数相当于返回insert(std::make_pair(key,T())。first->second; -密钥类型必须满足可复制的要求。 -映射的类型必须满足CopyConstructible和DefaultConstructible的要求。 如果执行了插入,则映射的值被初始化为值(默认为类类型构造,否则初始化为零),并返回对它的引用


这是因为
std::map
在使用下标运算符时为尚未存在的新键值插入默认值

如上所述:

1) 如果键不存在,则插入值类型(键,T())。此函数相当于返回insert(std::make_pair(key,T())。first->second; -密钥类型必须满足可复制的要求。 -映射的类型必须满足CopyConstructible和DefaultConstructible的要求。 如果执行了插入,则映射的值被初始化为值(默认为类类型构造,否则初始化为零),并返回对它的引用


的时候写
让我猜猜,
SuppID
是一个复杂的类型,你自己写的
@Yakk是正确的。这个提示让我进一步阅读,发现所有元素都需要反射性地返回false。目前他们没有,所以我相信这确实是问题所在。让我猜,
SuppID
是一个复杂类型,您自己编写的
@Yakk是正确的。这个提示让我进一步阅读,发现所有元素都需要反射性地返回false。目前他们没有,所以我相信这确实是问题所在。我也读了,但似乎元素不是使用默认构造函数构造的。因此,
Supplement*
getName()
返回
“cytogainer”
,而不是
“default protein shake”
。非常困惑。@lolol好吧,我无法从您给出的狭窄示例中判断为什么会发生这种情况。我也阅读了,但似乎元素不是使用其默认构造函数构造的。因此,
Supplement*
getName()
返回
“cytogainer”
,而不是
“default protein shake”
。非常困惑。@lolol好吧,我无法从你给出的狭窄样本判断为什么会发生这种情况。
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...
friend bool operator<( self const& lhs, self const& rhs ){
  return lhs.foo()<rhs.foo();
}