C++ Reference: Standard C++ Library reference: Containers: map: map: insert

news2024/9/29 21:30:32

C++官网参考链接:https://cplusplus.com/reference/map/map/insert/

公有成员函数
<map>
std::map::insert
C++98
single element (1)    
pair<iterator,bool> insert (const value_type& val);
with hint (2)    
iterator insert (iterator position, const value_type& val);
range (3)    
template <class InputIterator>  void insert (InputIterator first, InputIterator last);
C++11
single element (1)    
pair<iterator,bool> insert (const value_type& val);
template <class P> pair<iterator,bool> insert (P&& val);
with hint (2)    
iterator insert (const_iterator position, const value_type& val);
template <class P> iterator insert (const_iterator position, P&& val);
range (3)    
template <class InputIterator>  void insert (InputIterator first, InputIterator last);
initializer list (4)    
void insert (initializer_list<value_type> il);
插入元素
通过插入新元素扩展容器,有效地通过插入元素的数量增加容器的size。
因为map中的元素键是唯一的,所以插入操作检查每个插入的元素是否具有与容器中已存在的元素的键相等的键,如果是,则不插入元素,并返回指向该现有元素的iterator(如果函数返回一个值)。
有关允许重复元素的类似容器,请参阅multimap。
在map中插入元素的另一种方法是使用成员函数map::operator[]。
在内部,map容器按照其比较对象(comparison object)指定的标准按键对所有元素进行排序。元素总是按此顺序插入到其各自的位置。
形参决定插入多少元素以及初始化它们的值: 

形参 
val 
值要复制到(或移动作为)插入的元素。
成员类型value_type是容器中元素的类型,在map中定义为pair<const key_type,mapped_type>(参见map成员类型(map member types))。
C++98
模板形参P应该是可转换为value_type的类型。
C++14
只有当std::is_constructible<value_type, p&&>为true时,接受实参类型为P&&的签名才会被调用。

如果P被实例化为引用类型,则复制实参。

position 
提示可以插入元素的位置。
C++98
如果position指向插入元素之前的元素,则该函数优化其插入时间。
C++11
如果position指向插入元素之后的元素(如果是最后一个元素,则指向end ),则函数优化其插入时间。
请注意,这只是一个提示,并不强制将新元素插入到map容器中的该位置(map中的元素总是按照特定的顺序,这取决于它们的键)。
成员类型iterator和const_iterator在map中定义为指向元素的双向iterator(bidirectional iterator)类型。
first,last 
指定元素范围的iterator。在容器中插入范围[first,last)中的元素的副本。
注意,该范围包括first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
函数模板实参InputIterator应该是一个输入iterator(input iterator)类型,它指向可以构造value_type对象的类型元素。
il 
一个initializer_list对象。插入这些元素的副本。
这些对象是由初始化器列表声明器自动构造的。
成员类型value_type是容器中包含的元素类型,在map中定义为pair<const key_type,mapped_type>(参见map成员类型(map member types))。

返回值
单元素版本(1)返回一个pair,其成员pair::first设置为一个iterator,该iterator指向新插入的元素或map中具有等价键的元素。如果插入了新元素,pair::second将被设置为true;如果已经存在等价的键,则设置为false。
带有提示(2)的版本返回一个iterator,该iterator指向新插入的元素或在map中已经有等价键的元素。
成员类型iterator是指向元素的双向iterator(bidirectional iterator)类型。
pair是在<utility>中声明的类模板(参见pair)。

用例
// map::insert (C++98)
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;

  // first insert function version (single parameter):
  mymap.insert ( std::pair<char,int>('a',100) );
  mymap.insert ( std::pair<char,int>('z',200) );

  std::pair<std::map<char,int>::iterator,bool> ret;
  ret = mymap.insert ( std::pair<char,int>('z',500) );
  if (ret.second==false) {
    std::cout << "element 'z' already existed";
    std::cout << " with a value of " << ret.first->second << '\n';
  }

  // second insert function version (with hint position):
  std::map<char,int>::iterator it = mymap.begin();
  mymap.insert (it, std::pair<char,int>('b',300));  // max efficiency inserting
  mymap.insert (it, std::pair<char,int>('c',400));  // no max efficiency inserting

  // third insert function version (range insertion):
  std::map<char,int> anothermap;
  anothermap.insert(mymap.begin(),mymap.find('c'));

  // showing contents:
  std::cout << "mymap contains:\n";
  for (it=mymap.begin(); it!=mymap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

  std::cout << "anothermap contains:\n";
  for (it=anothermap.begin(); it!=anothermap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

  return 0;
}
输出: 

复杂度
如果插入单个元素,一般为size中的对数,但如果给出提示且给出的position是最佳的,则为平摊常量。
C++98
如果插入N个元素,一般为Nlog(size+N),但如果元素已经按照容器使用的相同排序标准排序,则为size+N中的线性。
C++11
如果插入N个元素,则为Nlog(size+N)。
如果范围已经排序,则实现可能会优化。

iterator的有效性
没有变化。

数据竞争
完成容器的修改。
同时访问现有的元素是安全的,但是迭代容器中的范围就不安全了。

异常安全
如果要插入单个元素,在异常情况下容器中不会有任何变化(强保证)。
否则,保证容器以有效状态结束(基本保证)。
如果元素结构的适当实参不支持allocator_traits::construct,或者如果指定了无效的position,则会导致未定义的行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【密码学】MD5、UUID,加盐,JWT的理解与使用范例

文章目录MD5加密&#xff1a;1、MD5加密安全访问认证示例代码&#xff1a;2、UUID简介&#xff1a;使用&#xff1a;3、加盐原理&#xff1a;示例代码&#xff1a;4、jwt认知&#xff1a;JWT 结构&#xff1a;范例代码&#xff1a;MD5加密&#xff1a; 1、MD5加密 Message Di…

计算机毕业设计springboot+vue基本微信小程序的疫情防控平台系统

项目介绍 当今社会疫情防控平台是必不可少的,大家都在听从政府的号召在居家隔离,不管是在城市还是在乡镇、农村,这引起我的注目,设计一套社区疫情防控系统,疫情防控需要大家共同努力、团结对社区居民进行了新型冠状病毒肺炎防控知识普及和宣传教育。针对这一需求,本文设计并实现…

LVS详细介绍,这么讲不信你不明白负载均衡

Linux virtual server&#xff0c;是一个基于集群技术和Linux操作系统&#xff0c;目的是实现一个高性能、高可用的服务器&#xff0c;主要工作在网络层。 他采取IP负载均衡&#xff0c;也叫三层负载均衡&#xff08;因为工作在OSI模型的第三层--网络层&#xff09;&#xff0…

java计算机毕业设计springboot+vue旅游攻略平台

项目介绍 目前,我国旅游业正处于高度发展的状态。越来越多的人在假日里选择出游作为放松自己身心的手段。随着网络的普及和发展,人们开始习惯性地在做某事之前先在网络上浏览相关的内容。旅游网站能够帮助游客了解景点相关信息,推出相应的线路信息供游客们选择,并查看相应的旅…

计算机网络实验——路由器的配置静态与RIP配置

前言 由于几个资料和老师给的ppt说的都不清楚&#xff0c;自己也没想到什么很巧妙的归纳方法&#xff0c;写个总结记录一下。 想必静态路由配置的过程中唯一的难点就是ip route这个指令&#xff0c;其他的什么添加接口&#xff0c;设置ip啥的都是基础路由配置中的内容&#xf…

2023春招面试专题:JAVA基础高频面试

ArrayList和LinkedList有哪些区别 ArrayList扩容机制: ArrayList() 会使用长度为零的数组ArrayList(int initialCapacity) 会使用指定容量的数组public ArrayList(Collection<? extends E> c) 会使用 c 的大小作为数组容量add(Object o) 首次扩容为 10&#xff0c;再次…

3D激光里程计其一:ICP

这里写目录标题1. ICP 整体流程2. ICP 的数学表示3. 基于 SVD 的 ICP3.1 旋转部分求解3.2 平移部分求解4. 基于优化的 ICP5. ICP 系列汇总Reference: 深蓝学院-多传感器融合 1. ICP 整体流程 目的&#xff1a;有两个相似的刚体点云&#xff0c;它们之间没有做好配准&#xff…

Golang原理分析:闭包及for range延迟绑定问题原理及解决

1.Golang中的闭包 1.1.什么是闭包 当一个函数引用了环境的变量&#xff0c;被引用的变量与该函数同时存在组成的系统&#xff0c;被称为闭包。 闭包 环境的变量 函数。 以下JavaScript代码展示了一个基础的闭包&#xff1a; name是init函数中的内部变量displayName()是i…

机器学习 鸢尾花(Iris Flower)数据集分析

目录 一&#xff1a;加载数据 二&#xff1a;提取特征数据 三&#xff1a;提取标签数据 四&#xff1a;数据划分 一&#xff1a;加载数据 加载数据&#xff0c;查看数据特征 from sklearn.datasets import load_iris# 1 加载数据 鸢尾花load_iris iris_datasets load_iri…

数据校验及在数据校验的情况下增加headers拿回数据

什么是数据校验&#xff1a; 当你向一个数据端口请求数据时&#xff0c;如果这个数据端口没有设置&#xff1a;Access-Control-Allow-Origin&#xff1a;*&#xff0c;那就是存在跨域限制了&#xff0c;你是拿不回来数据的。图示&#xff1a; 但是有些数据端口是设置了 Access…

【JS ES6】了解学习set类型和weakset类型

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 目录set类型与array和object的区别set元素检测与管理类型转换的重要性遍历set类型的方式使用set…

Spring - 事件监听机制 源码解析

文章目录Pre概述ApplicationEvent ------ 事件ApplicationListener ------ 事件监听器ApplicationEventPublisher ------ 事件发布者ApplicationEventMulticaster ------ 事件广播器spring主要的内置事件ContextRefreshedEventContextStartedEventContextStoppedEventContextCl…

设计模式概述之单例模式(四)

很多小伙伴&#xff0c;不知道设计模式是什么&#xff1f; 通常我们所说的设计模式是一种设计方案&#xff0c;是前人留下的经验及最佳实践。 想要学习设计模式&#xff0c;至少要把面向对象的基本结构全部了解。 设计模式&#xff0c;是建立在一定基础上的思维训练。 学习…

喜报 | 中关村发来贺电

2022年12月14日&#xff0c;由中关村金融科技产业发展联盟、中关村互联网金融研究院举办的“中关村金融科技系列活动——2023第十届中关村金融科技论坛年会暨2022“光大杯”中关村番钛客金融科技国际创新大赛颁奖典礼”已圆满落幕。本次会议为建设金融科技中心&#xff0c;共建…

【Pintos】实现自定义 UserProg 系统调用

&#x1f4ad; 写在前面&#xff1a;本文讲解的内容不属于 Pintos 的 Project 项目&#xff0c;而是关于 userprog 如何添加系统调用的&#xff0c;学习如何额外实现一些功能到系统调用中以供用户使用。因为涉及到 src/example 下的Makefile 的修改、lib 目录下 syscall-nr 系统…

搜索二叉树详解

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、搜索二叉树框架二、搜索二叉树概念三、搜索二叉树操作①Erase②Find递归③Insert递归④Erase递归&#xff0c;比Erase更简洁⑤析构函数⑥…

unity学习笔记--day01

今天学习制作了一个简单的抽卡功能&#xff0c;学习结束后目录结构如下&#xff1a; .mate文件是unity生成的配置文件&#xff0c;不用管 制作第一张卡片 创建一个空物体&#xff0c;改名为Card。 在Card下挂载以下UI组件&#xff1a; 编写数据脚本并挂载&#xff0c;unity采用…

Nginx教程(4)—Keepalived

文章目录4.1 高可用集群架构Keepalived双机主备原理4.2 安装Keepalived4.3 Keepalived核心配置文件4.4 Keepalived实现双主机主备高可用测试4.5 高可用集群架构Keepalived双主热备原理Nginx教程一 Nginx教程二 Nginx教程三 4.1 高可用集群架构Keepalived双机主备原理 我们知道…

【计算机毕业设计】78.汽车租赁系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 目 录 摘 要 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 第二章 开发技术介绍 2.1 Java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 SSM框架 第三章 系统分析 3.1 可行性分析 3.1.1 技术…

UnrealUBlueprintAsyncActionBase的使用

实现异步调用&#xff0c;之前我们介绍过一种FLatentActionInfo的方法&#xff0c;还有另外一种UBlueprintAsyncActionBase方法&#xff0c;可以实现异步节点&#xff0c;用于异步监听然后进行回调。按照如下步骤进行使用&#xff0c;我们同样以Delay一定帧数&#xff0c;并每帧…