map的insert和[]的区别

        遇到一些bug,检查代码,似乎没有问题,运行,出错。仔细检查,发现针对map变量,插入时候使用了find与insert。但是之前有个查询函数中却直接调用[]重载符去判断second变量是否为空。

        针对map而言,insert和[]还是有一些差别。使用find查找,未找到返回空迭代器。使用[],则一定给程序返回一个结果,如果未找到对应的键信息,则自行构造一个默认键值对,值为空。同理,当直接使用[]对某个键进行赋值操作,例如 mapTmp[2] = 22;如果键值2不存在,则构造pair<int,int>(2,22)的数据。如果键值存在,则直接进行修改。

int main()
{
	map<int, int> mapTmp;
	mapTmp.insert(std::make_pair(1,101));
	cout << "size:"<<mapTmp.size() << endl;
	for (auto &it : mapTmp)
	{
		cout << "first:" << it.first << "  second:" << it.second << endl;
	}
	auto &itse = mapTmp[2];
	cout << "size:" << mapTmp.size() << endl;
	for (auto &it : mapTmp)
	{
		cout << "first:" << it.first << "  second:" << it.second << endl;
	}
	mapTmp[2] = 102;
	cout << "size:" << mapTmp.size() << endl;
	for (auto &it : mapTmp)
	{
		cout << "first:" << it.first << "  second:" << it.second << endl;
	}
    
    return 0;
}

 

        同样,对于一个人而言。定向思维,不是一件好事。线上在数据库因为一些原因回档之后出现问题,思维定式告诉我,这个代码运行了很多次,经历了三次大型测试,肯定没有问题。一定是数据回档导致。而后将数据库中内容导出,发现数据内容与程序预定逻辑南辕北辙,似乎一些都在告诉我,你没错,是回档导致的一些莫名的小问题。

        实际上,问题其实很简单。在他人仅用三十分钟解决掉了之后,我才发现自己跳到了自己的“圈子里”。永远在自己的“圈子里”数羊的人,又怎么会注意栅栏的破洞。太多类似的情景,告诉我们,思维定式容易将人留在自己的“世界里”。这个世界,没有真实、没有光明、没有方向,有的只是无穷无尽、应接不暇的恭维、盲目、自以为是。这种思维定式,我有时候也叫他执念,执念如饮酒,有些人饮酒可以仗剑走天涯,意气风发,拂袖一洒,留万世佳名,歌一曲神话。有些人则相差甚远。emmmmm,真能扯。。。

### C++ 中 `std::map` 的 `insert` `find` 方法详解 #### 1. `std::map::insert` 方法 `std::map::insert` 是用于向 `std::map` 容器中插入键值对的方法。它支持多种插入方式,具体如下: - **通过 `std::pair` 插入** 可以使用 `std::make_pair` 或者直接创建 `std::pair` 来插入元素。例如: ```cpp std::map<int, std::string> myMap; myMap.insert(std::make_pair(1, "one")); ``` - **通过 `value_type` 插入** 使用 `std::map<key_type, mapped_type>::value_type` 类型来插入元素。这种方式本质上与上述方法相同,只是更显式地指定了类型: ```cpp myMap.insert(std::map<int, std::string>::value_type(2, "two")); ``` - **通过下标操作符插入** 虽然这不是严格意义上的 `insert` 方法调用,但它是一种常见的替代方案。如果键不存在,则会自动插入新键值对;如果键已存在,则更新其对应的值: ```cpp myMap[3] = "three"; ``` 以上三种方式都可以成功插入元素到 `std::map` 中[^2]。 --- #### 2. `std::map::find` 方法 `std::map::find` 是用来查找指定键是否存在以及返回对应迭代器的方法。它的基本语法如下: ```cpp iterator find(const key_type& k); const_iterator find(const key_type& k) const; ``` - 如果找到匹配的键,则返回指向该键值对的迭代器; - 如果未找到,则返回 `myMap.end()`。 下面是一个完整的例子展示如何使用 `find` 方法: ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap; // 插入一些数据 myMap.insert(std::make_pair(1, "one")); myMap.insert(std::make_pair(2, "two")); // 查找键为 1 的元素 auto it = myMap.find(1); // 返回指向 {1, "one"} 的迭代器 if (it != myMap.end()) { std::cout << "Key found: " << it->first << ", Value: " << it->second << "\n"; } else { std::cout << "Key not found\n"; } // 尝试查找不存在的键 it = myMap.find(3); // 返回 end() if (it == myMap.end()) { std::cout << "Key 3 is not present in the map.\n"; } } ``` 在这个程序中,我们展示了如何利用 `find` 方法定位特定键并访问其关联值。 --- #### 总结 - `std::map::insert` 提供了灵活的方式将新的键值对加入容器。 - `std::map::find` 则允许快速检索某个键的存在状态及其映射值。 两者共同构成了管理 `std::map` 数据结构的核心功能之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值