关于C++中std::unordered_map.insert().second的作用、返回值及布尔值返回原因的技术咨询
关于
std::unordered_map::insert返回值中.second的疑问解答 嘿,我来帮你把这个问题掰扯清楚——你的代码里用到的.second其实是std::unordered_map::insert返回值的一个关键成员,结合你的代码场景,我分三点给你解答:
1. .second的具体作用是什么?
std::unordered_map::insert方法执行后,会返回一个**std::pair类型的对象**,这个配对里装着两个核心信息:
.first:是指向map中对应键的迭代器——不管插入成功还是失败,它都会指向这个键在map里的位置(成功则指向新插入的元素,失败则指向已存在的那个元素).second:专门用来标记插入操作是否成功的状态:如果插入的键之前不存在,插入成功,它的值是true;如果键已经存在,插入失败,它的值是false
就像你代码里第三次插入"google"时,因为这个键已经在map里了,所以.second返回false,最后输出"failed"。
2. 它返回的值是什么类型?
.second的类型就是布尔类型bool,只有true和false两种取值。
3. 为什么使用.second会返回布尔值?
因为insert本身返回的不是布尔值,而是一个std::pair<std::unordered_map<std::string, std::string>::iterator, bool>类型的对象——这个对象同时包含了迭代器和插入状态两个结果。你写.second,就是从这个pair对象里取出专门存储插入结果的布尔成员。
如果不写.second,你拿到的是整个pair对象,没法直接用在三元表达式(ok ? "success" : "failed")里做判断,VSCode提示里说的"second is a copy of the second object",其实就是指.second是这个pair里第二个元素(也就是布尔值)的副本。
你也可以把代码拆开来写,看得更清楚:
// 接收insert的完整返回值 auto insert_result = url.insert(std::pair<std::string,std::string>("google","www.google.com")); // 取出迭代器,指向map中"google"对应的元素 auto it = insert_result.first; // 取出插入是否成功的布尔值 bool is_success = insert_result.second;
这样你就能明白,insert返回的是一个“组合结果”,.second只是把其中的成功状态单独拿出来用而已。
内容的提问来源于stack exchange,提问作者Kwon34
相关产品推荐
相关产品推荐

