c++ std::map::iterator一无所获,但下标操作符返回对映射值的引用
C++ std::map::iterator found nothing, yet subscript operator returns reference to mapped value?
可能做了一些非常愚蠢的事情,但我不明白为什么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();
}
如果你写错了<
,你会得到疯狂的行为。
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何在映射中返回null
- 从函数返回对映射的引用
- 为什么我不能返回带有透明函子的法线映射引用?
- CGAL-三角网格,返回面对面映射
- 返回各种类型的函数的SWIG类型映射
- 类型映射资源并将列表转换为矢量(并返回)
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- C++ 返回映射中对象的值
- 返回字符串和不同向量数据类型的映射C++
- 取消引用映射迭代器时返回对临时的引用
- 当请求的键丢失时,有没有办法从向量映射返回 std::vector ref?
- 为什么 unordered_map::equal_range upper_bound 如果键小于第一个映射元素,则返回
- 整数和元组的静态 STL 映射返回 0
- C++函数来返回基于参数的比较器通用映射类型?
- 为什么要对 map::find 应用不存在的键将返回一个C++中第一个值映射大小的迭代器
- typedef映射作为返回类型到函数会引发编译器错误
- 返回映射的模板化类成员函数的声明
- 交叉引用类并返回映射<字符串,类>
- 如何创建一个适配器,该适配器将使用键的谓词根据筛选的键返回映射值