STL map的几种赋值方式

本文总结了C++中map的几种赋值方法,包括使用数组索引、insert成员函数以及C++11的emplace。指出[]操作会替换旧值,insert会忽略重复项。推荐在C++11环境下使用emplace,因其简洁高效。同时分享了对STL编程的哲学思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

map的几种赋值方法比较

学习或者工作中经常会用到map,赋值是常用的操作,map有好几种赋值方法,哪一种方式最有效?网上了解了一些资料,在这里总结一下。

常用的赋值方式有如下几种。

   // 1) Assignment using array index notation
   Foo["Bar"] = 12345;

   // 2) Assignment using member function insert() and STL pair
   Foo.insert(std::pair<string,int>("Bar", 12345));

   // 3) Assignment using member function insert() and "value_type()"
   Foo.insert(map<string,int>::value_type("Bar", 12345));

   // 4) Assignment using member function insert() and "make_pair()"
   Foo.insert(std::make_pair("Bar", 12345));
    
   // 5)C++ 11
   Foo.emplace("Bar", 12345);

 一、 [] 与 insert这两种方式存在语义差异

  • []替换旧值(如果有)
  • insert忽略新值(如果已经存在旧值)

二、几种 insert 方式的比较

  • std::map<std::string, int>::value_type  和 std::pair<std::string const, int>之间没有重要的差别
    std::make_pair("Bar", 12345) 相比 std::pair<std::string, int>("Bar", 12345)开销更少

     

一般来说,[] 用于更新,insert会忽略重复项。std::make_pair遵循DRY准则,不会重复自身。

启用C++ 11的情况下,推荐使用emplace,最简单也是最效的方式。(它的行为是insert,但是它构造了新的元素)

学习STL的时候,看到前辈表达了STL的爱情观hh,分享一下。

前段日子读了STL的源码,大师级的作品真是精致到让人喟叹。当然,有时候你在网上还是可以看到很多对STL的批评,例如,对编译器要求很高,很多时候出错了的话,打印出来的错误信息总是让人摸不着头脑的。这确实是比较头疼的一个问题,因为模板编程,编译的过程总是分为两个部分的,是先要找到相应的模板,然后才对模板进行具现化,有时候单纯从模板来看,似乎很完整,没有什么问题呀,可是一旦投入使用了,才发现找不到合适的具现化版本,于是又要搞特化了。某日在路上行走,突然想起爱情这个难题,突然想起具现化,

突然觉得爱情就像是一个模板类,是想象,没有实现的时候,它看起来很完美,很丰富,可是爱情一旦具现化,它便成了独此一家的一个类,想象的空间本就狭窄了,倘若需求比较复杂,还须得有偏特化版本,不然就要出错。每个女人心目中的恋爱对象都是完美的,是那种选择性的完美,她爱的并不是那个实体,而是加诸于该实体上的想象。

 

 

 

C++ STL (Standard Template Library) 中的 `map` 是一种关联容器,它存储键值对,并根据键进行排序。当你需要拷贝一个 `map` 时,有几种常见的做法: 1. **浅拷贝(Shallow Copy)**: 如果只是简单地赋值 (`=`) 一个 `map` 到另一个变量,这是创建一个新的 `map` 对象,并将原 `map` 的引用复制到新对象。新的 `map` 只有一个指向数据的指针,所以修改其中一个会影响另一个。 ```cpp std::map<int, std::string> original; // 填充 original... std::map<int, std::string> copy = original; // 浅拷贝 ``` 在这种情况下,如果你直接修改 `copy`,`original` 也会改变。 2. **深拷贝(Deep Copy)**: 使用 `std::map` 的内置深拷贝构造函数 `std::map(const std::map&)` 或者 `make_map(std::map const&)`,会创建一个新的独立 `map`,包含所有元素的副本。 ```cpp std::map<int, std::string> copy(original); // 深拷贝 ``` 现在,两个 `map` 都有自己的独立数据,修改一个不会影响另一个。 3. **迭代器拷贝**: 如果你想复制 `map` 中的数据而不复制整个结构,可以遍历原 `map` 的迭代器,并插入到新的 `map` 中。但这通常只适用于不需要保持原有键值顺序的情况。 ```cpp std::map<int, std::string> new_copy; for (const auto& pair : original) { new_copy[pair.first] = pair.second; } ``` **相关问题--:** 1. 什么时候应该避免使用浅拷贝 `map`? 2. 如何判断C++ STL中的map是否进行了深拷贝? 3. 使用迭代器复制 `map` 后,原始 `map` 是否还可用?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值