加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C++ STL map insert 插入数据的4种办法

发布时间:2022-07-16 02:17:28 所属栏目:语言 来源:互联网
导读:前面讲过,C++ STL map 类模板中对[ ]运算符进行了重载,即根据使用场景的不同,借助[ ]运算符可以实现不同的操作。举个例子: #include iostream #include map //map #include string //string using namespace std; int main() { std::mapstring, string
  前面讲过,C++ STL map 类模板中对[ ]运算符进行了重载,即根据使用场景的不同,借助[ ]运算符可以实现不同的操作。举个例子:
  #include <iostream>
  #include <map>  //map
  #include <string> //string
  using namespace std;
  int main()
  {
      std::map<string, string> mymap{ {"STL教程","http://c.biancheng.net/java/"} };
      //获取已存储键值对中,指定键对应的值
      cout << mymap["STL教程"] << endl;
      //向 map 容器添加新键值对
      mymap["Python教程"] = "http://c.biancheng.net/python/";
      //修改 map 容器已存储键值对中,指定键对应的值
      mymap["STL教程"] = "http://c.biancheng.net/stl/";
      for (auto iter = mymap.begin(); iter != mymap.end(); ++iter) {
          cout << iter->first << " " << iter->second << endl;
      }
     
      return 0;
  }
  程序执行结果为:
  http://c.biancheng.net/java/
  Python教程 http://c.biancheng.net/python/
  STL教程 http://c.biancheng.net/stl/
 
  可以看到,当操作对象为 map 容器中已存储的键值对时,则借助 [ ] 运算符,既可以获取指定键对应的值,还能对指定键对应的值进行修改;反之,若 map 容器内部没有存储以 [ ] 运算符内指定数据为键的键值对,则使用 [ ] 运算符会向当前 map 容器中添加一个新的键值对。
 
  实际上,除了使用 [ ] 运算符实现向 map 容器中添加新键值对外,map 类模板中还提供有 insert() 成员方法,该方法专门用来向 map 容器中插入新的键值对。
  注意,这里所谓的“插入”,指的是 insert() 方法可以将新的键值对插入到 map 容器中的指定位置,但这与 map 容器会自动对存储的键值对进行排序并不冲突。当使用 insert() 方法向 map 容器的指定位置插入新键值对时,其底层会先将新键值对插入到容器的指定位置,如果其破坏了 map 容器的有序性,该容器会对新键值对的位置进行调整。
 
  自 C++ 11 标准后,insert() 成员方法的用法大致有以下 4 种。
 
  1) 无需指定插入位置,直接将键值对添加到 map 容器中。insert() 方法的语法格式有以下 2 种:
  //1、引用传递一个键值对
  pair<iterator,bool> insert (const value_type& val);
  //2、以右值引用的方式传递键值对
  template <class P>
      pair<iterator,bool> insert (P&& val);
 
  其中,val 参数表示键值对变量,同时该方法会返回一个 pair 对象,其中 pair.first 表示一个迭代器,pair.second 为一个 bool 类型变量:
  如果成功插入 val,则该迭代器指向新插入的 val,bool 值为 true;
  如果插入 val 失败,则表明当前 map 容器中存有和 val 的键相同的键值对(用 p 表示),此时返回的迭代器指向 p,bool 值为 false。
  以上 2 种语法格式的区别在于传递参数的方式不同,即无论是局部定义的键值对变量还是全局定义的键值对变量,都采用普通引用传递的方式;而对于临时的键值对变量,则以右值引用的方式传参。有关右值引用,可阅读《C++右值引用》一文做详细了解。
 
  举个例子:
  #include <iostream>
  #include <map>  //map
  #include <string> //string
  using namespace std;
  int main()
  {
      //创建一个空 map 容器
      std::map<string, string> mymap;
     
      //创建一个真实存在的键值对变量
      std::pair<string, string> STL = { "STL教程","http://c.biancheng.net/stl/" };
     
      //创建一个接收 insert() 方法返回值的 pair 对象
      std::pair<std::map<string, string>::iterator, bool> ret;
     
      //插入 STL,由于 STL 并不是临时变量,因此会以第一种方式传参
      ret = mymap.insert(STL);
      cout << "ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl;
      //以右值引用的方式传递临时的键值对变量
      ret = mymap.insert({ "C语言教程","http://c.biancheng.net/c/" });
      cout << "ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl;
      //插入失败样例
      ret = mymap.insert({ "STL教程","http://c.biancheng.net/java/" });
      cout << "ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl;
      return 0;
  }
  程序执行结果为:
  ret.iter = <{STL教程, http://c.biancheng.net/stl

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!