c++ 的map、iterator用法

article/2025/9/19 8:41:13

https://blog.csdn.net/bangdingshouji/article/details/73028424

参考:

  1. 资料一:http://www.cplusplus.com/reference/iterator/(第一参考,简单精要)
  2. 资料二:http://jjhou.boolan.com/programmer-3-traits.pdf(侯捷随笔,非常全面,有时间深刻可看)
  3. 资料三:http://en.cppreference.com/w/cpp/iterator(纯资料)
  4. https://blog.csdn.net/bangdingshouji/article/details/73028424

1.map的构造函数

Map<int, string>mapStudent;
2. 数据的插入
在构造map容器后
第一种:用insert函数插入pair数据
#pragma warning (disable:4786) )
#include <map>
#include
#include
Using namespace std;
Int main()
{
Map<int, string>mapStudent;
mapStudent.insert(pair<int, string>(1, “student_one”));
mapStudent.insert(pair<int, string>(2, “student_two”));
mapStudent.insert(pair<int, string>(3, “student_three”));
map<int, string>::iterator iter;
for(iter =mapStudent.begin(); iter !=mapStudent.end(); iter++)
{
Cout<first<<” ”<second<<end;
}
}
第二种:用insert函数插入value_type数据,下面举例说明
#include <map>
#include
#include
Using namespace std;
Int main()
{
Map<int, string>mapStudent;
mapStudent.insert(map<int, string>::value_type (1, “student_one”));
mapStudent.insert(map<int, string>::value_type (2, “student_two”));
mapStudent.insert(map<int, string>::value_type (3, “student_three”));
map<int, string>::iterator iter;
for(iter =mapStudent.begin(); iter !=mapStudent.end(); iter++)
{
Cout<first<<” ”<second<<end;
}
}
第三种:用数组方式插入数据,下面举例说明
#include <map>
#include
#include
Using namespace std;
Int main()
{
Map<int, string>mapStudent;
mapStudent[1] = “student_one”;
mapStudent[2] = “student_two”;
mapStudent[3] = “student_three”;
map<int, string>::iterator iter;
for(iter =mapStudent.begin(); iter !=mapStudent.end(); iter++)
{
Cout<first<<” ”<second<<end;
}
}
以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值,用程序说明

迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。

(1) 每种容器类型都定义了自己的迭代器类型,如vector:
vector::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。
(2) 使用迭代器读取vector中的每一个元素:
vector ivec(10,1);
for(vector::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
*iter=2; //使用 * 访问迭代器所指向的元素
}
const_iterator:
只能读取容器中的元素,而不能修改。
for(vector::const_iterator citer=ivec.begin();citer!=ivec.end();citer++)
{
cout<<*citer;
//*citer=3; error
}
vector::const_iterator 和 const vector::iterator的区别
const vector::iterator newiter=ivec.begin();
*newiter=11; //可以修改指向容器的元素
//newiter++; //迭代器本身不能被修改
(3) iterator的算术操作:
iterator除了进行++,–操作,可以将iter+n,iter-n赋给一个新的iteraor对象。还可以使用一个iterator减去另外一个iterator.
const vector::iterator newiter=ivec.begin();
vector::iterator newiter2=ivec.end();
cout<<" "<<newiter2-newiter;
一個很典型使用vector的STL程式:
1 #include
2 #include
3
4 using namespace std;
5
6 int main() {
7 vector ivec;
8 ivec.push_back(1);
9 ivec.push_back(2);
10 ivec.push_back(3);
11 ivec.push_back(4);
12
13 for(vector::iterator iter = ivec.begin();1. iter != ivec.end(); ++iter)
14 cout << *iter << endl;

15 }

迭代器可以很好的兼容C++的内置类型,特别是常见的C++指针被视为C++数组的迭代器。当然,在标准的C++库中所有的容器都定义了一个迭代器类型,即嵌套类型的迭代器,代表各自的指针类型。

迭代器Iterator的分类:

迭代器可以分为不同的种类,这是因为他们使用不同的算法、不同的要求附加在其身上。例如,find()算法需要一个可以递增的迭代器,而reverse()算法需要一个可以递减的迭代器等。总之,在STL和C++标准库中有5种迭代器。

  1. 输入迭代器(Input Iterator):只能向前单步迭代元素,不允许修改由该迭代器所引用的元素;
  2. 输出迭代器(Output Iterator):只能向前单步迭代元素,对由该迭代器所引用的元素只有写权限;
  3. 向前迭代器(Forward Iterator):该迭代器可以在一个区间中进行读写操作,它拥有输入迭代器的所有特性和输出迭代器的部分特性,以及向前单步迭代元素的能力;
  4. 双向迭代器(Bidirectional Iterator):在向前迭代器的基础上增加了向后单步迭代元素的能力;
  5. 随机访问迭代器(Random Access Iterator):不仅综合以后4种迭代器的所有功能,还可以像指针那样进行算术计算;

vector、deque提供的是随机访问迭代器,list提供的是双向迭代器,set和map提供的是向前迭代器。

  1. 迭代器(Iterator)的介绍

  2. 背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。
    定义:迭代器是一种检查容器内元素并遍历元素的数据类型。
    迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围
    迭代器(Iterator)是指针(pointer)的泛化,它允许程序员用相同的方式处理不同的数据结构(容器)。
    (1)迭代器类似于C语言里面的指针类型,它提供了对对象的间接访问。
    (2)指针是C语言中的知识点,迭代器是C++中的知识点。指针较灵活,迭代器功能较丰富。
    (3)迭代器提供一个对容器对象或者string对象的访问方法,并定义了容器范围

  3. 迭代器和指针的区别:
    容器和string有迭代器类型同时拥有返回迭代器的成员。如:容器有成员begin和end,其中begin成员复制返回指向第一个元素的迭代器,而end成员返回指向容器尾元素的下一个位置的迭代器,也就是说end指示的是一个不存在的元素,所以end返回的是尾后迭代器

  4. 容器迭代器的使用
    每种容器类型都定义了自己的迭代器类型,如vector:vector< int>:: iterator iter;//定义一个名为iter的变量,数据类型是由vector< int>定义的iterator 类型。简单说就是容器类定义了自己的iterator类型,用于访问容器内的元素。每个容器定义了一种名为iterator的类型,这种类型支持迭代器的各种行为
    常用迭代器类型如下:
    这里写图片描述
    如上图所示,迭代器类型主要支持两类,随机访问和双向访问。其中vector和deque支持随机访问,list,set,map等支持双向访问。
    1)随机访问:提供了对数组元素进行快速随机访问以及在序列尾部进行快速插入和删除操作。
    2)双向访问:插入和删除所花费的时间是固定的,与位置无关。


http://chatgpt.dhexx.cn/article/w7THR4t2.shtml

相关文章

Iterator用法

Interator迭代集合&#xff0c;可以进行remove操作。 public class Test {public static void main(String[] args) {List<String> lists new ArrayList<>();lists.add("Sam");lists.add("Tom");lists.add("David");lists.add(&qu…

Java迭代器(Iterator)的用法

Java迭代器&#xff08;Iterator&#xff09;的用法 什么是IteratorIterator的应用 什么是Iterator Iterator(迭代器)&#xff0c;它是一种用于访问集合的方法&#xff0c;可用于迭代 ArrayList 和 HashSet 等集合(或者也可以说成&#xff0c;遍历并选择序列中的对象)。 Iter…

浅谈MySQL数据库的设计流程

系列文章目录 本次文章的内容是记录有关于MySQL学习中对数据库设计流程的一个记录和在设计流程中需要注意的一些事情。 文章目录 系列文章目录前言一、数据库设计1.1为什么要着重于对数据库的详细设计1.2数据库的设计流程&#xff08;1&#xff09;根据应用系统的功能&#xf…

数据库设计说明书

目录 1引言 1.1编写目的 1.2背景 1.3定义 1.4参考资料 2外部设计 2.1标识符和状态 2.2使用它的程序 2.3约定 2.4专门指导 2.5支持软件 3结构设计 3.1概念结构设计 3.2逻辑结构设计 3.3物理结构设计 4运用设计 4.1数据字典设计 4.2安全保密设计 数据库设计说明…

MySQL之数据库设计六个步骤

前言 今天有个前同事去面试&#xff0c;被面试官问了一个这样的问题&#xff1a;如果让你去设计数据库你改怎么设计&#xff1f;或者有哪些步骤&#xff1f;被问到这里可能我们就懵逼了&#xff0c;是啊&#xff0c;该怎么去设计呢。 在软件开发的过程中&#xff0c;数据库设…

用mysql设计数据库的步骤_数据库设计的主要步骤是什么

数据库设计的主要步骤是什么 发布时间&#xff1a;2020-08-12 10:00:24 来源&#xff1a;亿速云 阅读&#xff1a;141 作者&#xff1a;小新 这篇文章给大家分享的是有关数据库设计的主要步骤是什么的内容。小编觉得挺实用的&#xff0c;因此分享给大家做个参考。一起跟随小编过…

关系数据库设计步骤

看这篇文章之前&#xff0c;希望大家能够对数据库系统、数据模型有知识储备&#xff0c;如果有疑惑可以看我的另外一篇博客数据库系统。 还需要对关系型数据库基础知识有所了解&#xff0c;有疑惑朋友可以看关系型数据库基础知识 文章目录 数据库设计的步骤概念结构设计E-R模型…

数据库设计步骤(超级详细)|数据库

数据库设计 我们先来看这样一个问题 假如遇到下面这样的设计需求&#xff0c;我们如何完成数据库的设计呢&#xff1f; 设计需求&#xff1a; 假设商品经销商有基本实体集&#xff1a;供应商Vendors、产品目录Products、顾客信息Customers和顾客订单Orders。 各个实体的属性集…

nginx跨域|配置nginx跨域详解

在项目的nginx配置目录中&#xff0c;添加如下命令即可解决跨域问题&#xff0c;亲测有效。 # $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号 add_header Access-Control-Allow-Origin $http_origin; # 表示请求头的字段 动态获取 add_head…

nginx跨域配置步骤

假设接口服务器地址&#xff1a;http://192.168.2.1:8081 1、先查看接口本身是否能调通&#xff08;随便找个get接口在浏览器测试下&#xff0c;如&#xff1a;http://192.168.2.1:8081/testmanage/test/deleteTest&#xff09; 2、找到nginx的压缩目录&#xff0c;修改conf/…

Nginx跨域配置详解

一、概念 Ningx,是轻量级、开源的web服务器&#xff0c;具有高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP代理服务器。 优势&#xff1a; 以事件驱动的方式编写&#xff0c;使其具有高并发高性能可扩展性好热部署 应用场景 静态资源服务&#xff0…

CORS解决跨域问题(Nginx跨域配置)

背景&#xff1a; 同域&#xff1a;域名&#xff08;父域名和子域名都相同&#xff09;&#xff0c;端口&#xff0c;协议都相同 跨域&#xff1a;非同域的请求 问题&#xff1a; 浏览器上&#xff0c;我们访问127.0.0.1:80&#xff0c;但是127.0.0.1:80 会去请求127.0.0.1:…

Nginx配置反向代理解决跨域问题

通过Nginx配置反向代理结果跨域问题 第一步&#xff1a;下载Nginx 一、下载 官网下载地址&#xff1a;http://nginx.org/en/download.html 我下载的版本&#xff1a;http://nginx.org/download/nginx-1.15.2.zip &#xff08;我也是参考网上的步骤&#xff0c;所以下载的不是…

Nginx配置跨域及解析

一、代码 先放上nginx配置代码 # 以代理百度地图api为例location /mymap/ {proxy_pass http://api.map.baidu.com/;# 配置跨域代理 add_header Access-Control-Allow-Origin $http_origin;add_header Access-Control-Allow-Methods GET,POST,OPTIONS…

nginx配置详解,nginx跨域问题

文章目录 前言更改hosts文件新增velocityerp.top.conf配置文件nginx配置header参数&#xff08;解决跨域&#xff09;,接口方配置nginx反向代理(解决跨域)&#xff0c;发送方配置nginx端口转发&#xff08;解决跨域&#xff09;nginx内部跳转nginx配置优先级详解 前言 本文介绍…

nginx 配置支持跨域

在nginx.conf文件内&#xff0c;server中加入以下内容 #允许跨域请求的域&#xff0c;*代表所有 add_header Access-Control-Allow-Origin *; #允许带上cookie请求 add_header Access-Control-Allow-Credentials true; #允许请求的方法&#xff0c;比如 GET/POST/PUT/DELETE a…

通过Nginx来解决跨域问题

Nginx跨域实现 首先大家要搞清楚什么是跨域&#xff0c;为什么会有跨域情况的出现。哪些情况属于跨域&#xff1f; 跨域&#xff1a;由于浏览器的同源策略&#xff0c;即属于不同域的页面之间不能相互访问各自的页面内容 注&#xff1a;同源策略&#xff0c;单说来就是同协议&a…

Nginx 解决跨域

项目准备 前端网站地址&#xff1a;http://localhost:8080 服务端网址&#xff1a;http://localhost:8081 确认服务端是没有处理跨域的&#xff0c;先用postman测试服务端接口是正常的 当前端网站8080去访问服务端接口时&#xff0c;就产生了跨域问题&#xff0c;那么如何解…

1 Nginx跨域配置

跨域问题在之前的单体架构开发中&#xff0c;其实是比较少见的问题&#xff0c;除非是需要接入第三方SDK时&#xff0c;才需要处理此问题。但随着现在前后端分离、分布式架构的流行&#xff0c;跨域问题也成为了每个Java开发必须要懂得解决的一个问题。 跨域问题产生的原因 产…