当前位置: 首页 > news >正文

面试之快速学习STL-迭代适配器

先放一张大图

参考:http://c.biancheng.net/view/7255.html
在这里插入图片描述

1. 反向迭代器

例子:

    std::list<int> values{1,2,3,4,5};auto start_it = values.rbegin();const auto end_it = values.rend();//start_it end_it std::reverse_iterator<std::list<int>>::iteratorwhile (start_it != end_it) {std::cout << *start_it << std::endl;++start_it;}/*54321*/
  1. 想使用反向迭代器实现逆序遍历容器,则该容器的迭代器类型必须是双向迭代器或者随机访问迭代器。
    在这里插入图片描述
  2. 常见操作
    在这里插入图片描述
    std::vector<int> values{1,2,3,4,5};auto r_start_it = values.rbegin();const auto end_it = values.rend();//r_start_it end_it std::reverse_iterator<std::list<int>>::iteratorwhile (r_start_it != end_it) {std::cout << *r_start_it << std::endl;++r_start_it;}/*54321*/r_start_it = values.rbegin();std::cout << "r_start_it + 3 = " << *(r_start_it + 3)<< std::endl;std::cout << "r_start_it[3] = " << r_start_it[3] << std::endl;
  1. 注意这里不能用std::list,因为它是双向迭代器, +3的操作需要随机访问迭代器。故联想到std::list排序只能使用list提供的 sort 接口,而不能使用algorithm 提供的 sort 接口,因为链表的物理地址不连续,迭代器为双向迭代器,不支持 + - 操作,而算法库中的 sort 接口需要支撑 + - 的随机迭代器;

2. 插入迭代器适配器

在这里插入图片描述

感觉没啥好讲的,看看代码:

#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main() {//创建一个 vector 容器std::vector<int> foo;//创建一个可向 foo 容器尾部添加新元素的迭代器std::back_insert_iterator< std::vector<int> > back_it(foo);//将 5 插入到 foo 的末尾back_it = 5;//将 4 插入到当前 foo 的末尾back_it = 4;//将 3 插入到当前 foo 的末尾back_it = 3;//将 6 插入到当前 foo 的末尾back_it = 6;//输出 foo 容器中的元素for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it)std::cout << *it << ' ';return 0;/*5 4 3 6*/
}
  1. 每次插入新元素时,该元素都会插入到当前 foo 容器的末尾。换句话说,程序中 11-17 行的每个赋值语句,都可以分解为以下这 2 行代码:

//pos表示指向容器尾部的迭代器,value 表示要插入的元素
pos = foo.insert(pos,value);
++pos;

3. istream_iterator和ostream_iterator

原理源码:原理

  1. 自己理解:istream_iterator是重载了++操作符然后调用的是read(); ostream_iterator重载 = 操作符,做输出操作
#include <iostream>
#include <thread>
#include <vector>
#include <numeric>
#include <algorithm>
#include <cstring>
#include <deque>
#include <iterator>
using namespace std;int main()
{deque<int> id;istream_iterator<int> intie(cin),eos;                     //开始触发一次输入   copy(intie, eos, inserter(id, id.begin()));               //迭代器类型为InputIterator,所以这里调用copy的时候采用*result = *first;版本,会使用重载类型 ,那么就会转换为插入操作      //其中++first会继续调用下一个,然后重载为新的输入ostream_iterator<int> outie(cout, " ");                  //deque的迭代器类型为random_access_iterator,也会是 *result = *first;调用赋值操作  result++操作,返回本身,不影响后面的输出操作copy(id.begin(), id.end(), outie);                       //将=操作,转换为输出操作cout << endl;system("pause");
}

3. 移动迭代器

std::vector<std::string> v1{ "haha", "xixi" };//调用移动构造函数std::vector<std::string> v2(make_move_iterator(v1.begin()), make_move_iterator(v1.end()));std::cout << "v1 : " << std::endl;for (auto record : v1)std::cout << record << std::endl;std::cout << "v2 : " << std::endl;for (auto record : v2)std::cout << record << std::endl;/*v1 :v2 : hahaxixi*/

没啥好说的,就是每个值调用移动构造函数make_move_iterator

4. advance()函数用法详解

template <class InputIterator, class Distance>
void advance (InputIterator& it, Distance n);

  1. 根据 it 类型是否为随机访问迭代器,advance() 函数底层采用了不同的实现机制:
    当 it 为随机访问迭代器时,由于该类型迭代器支持 p+n 或者 p-n(其中 p 就是一个随机访问迭代器)运算,advance() 函数底层采用的就是 it+n 操作实现的;
    当 it 为其他类型迭代器时,它们仅支持进行 ++ 或者 – 运算,这种情况下,advance() 函数底层是通过重复执行 n 个 ++ 或者 – 操作实现的。

#include <iostream>     // std::cout
#include <iterator>     // std::advance
#include <forward_list>
using namespace std;
int main() {//创建一个 forward_list 容器forward_list<int> mylist{1,2,3,4};//it为前向迭代器,其指向 mylist 容器中第一个元素forward_list<int>::iterator it = mylist.begin();//借助 advance() 函数将 it 迭代器前进 2 个位置advance(it, 2);cout << "*it = " << *it;return 0;
}

注意: 此程序中,由于 it 为前向迭代器,其只能进行 ++ 操作,即只能前进(右移),所以 advance() 函数的第 2 个参数只能为正数。

5. distance()函数用法详解

template
typename iterator_traits::difference_type distance (InputIterator first, InputIterator last);

  1. first 和 last 的迭代器类型,直接决定了 distance() 函数底层的实现机制:
    当 first 和 last 为随机访问迭代器时,distance() 底层直接采用 last - first 求得 [first, last) 范围内包含元素的个数,其时间复杂度为O(1)常数阶;
    当 first 和 last 为非随机访问迭代器时,**distance() 底层通过不断执行 ++first(或者 first++)直到 first==last,**由此来获取 [first, last) 范围内包含元素的个数,其时间复杂度为O(n)线性阶。
#include <iostream>     // std::cout
#include <iterator>     // std::distance
#include <list>         // std::list
using namespace std;int main() {//创建一个空 list 容器list<int> mylist;//向空 list 容器中添加元素 0~9for (int i = 0; i < 10; i++) {mylist.push_back(i);}//指定 2 个双向迭代器,用于执行某个区间list<int>::iterator first = mylist.begin();//指向元素 0list<int>::iterator last = mylist.end();//指向元素 9 之后的位置//获取 [first,last) 范围内包含元素的个数cout << "distance() = " << distance(first, last);return 0;
}

相关文章:

面试之快速学习STL-迭代适配器

先放一张大图 参考&#xff1a;http://c.biancheng.net/view/7255.html 1. 反向迭代器 例子&#xff1a; std::list<int> values{1,2,3,4,5};auto start_it values.rbegin();const auto end_it values.rend();//start_it end_it std::reverse_iterator<std::lis…...

【Linux】【驱动】杂项设备驱动

【Linux】【驱动】杂项设备驱动 Linux三大设备驱动1. 我们这节课要讲的杂项设备驱动是属于我们这三大设备驱动里面的哪个呢?2.杂项设备除了比字符设备代码简单&#xff0c;还有别的区别吗?3.主设备号和次设备号是什么? 挂载驱动 杂项设备驱动是字符设备驱动的一种&#xff0…...

【HCIP】10.路由策略

&#x1f4ce;13 路由策略与路由控制.pptx 通过修改路由的属性&#xff0c;影响了路由的生成及选路&#xff0c;最终影响了转发流量的路径&#xff1b;控制平面。 ACL IP prefix Filter-Policy Router-Policy 笔记...

【腾讯云Cloud Studio实战训练营】使用Cloud Studio社区版快速构建React完成点餐H5页面还原

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f468;‍&#x1f4bb;上一篇…...

测试开发工程必备技能之一:Mock的使用

1. 背景 在实际产品开发过程中&#xff0c;某个服务或前端依赖一个服务接口&#xff0c;该接口可能依赖多个底层服务或模块&#xff0c;或第三方接口&#xff0c;比如说服务 A 依赖服务B&#xff0c;服务B又依赖服务 C 这种依赖的问题会导致原本的需求目的是要验证服务A&…...

Qbytearray:从十六进制字符串转字节一些注意事项

1、从十六进制字符串转字节后&#xff0c;按字节使用时 QByteArray data QByteArray::fromHex("cc94");printf("%x %x\n",data.at(0),data.at(0)&0xff);//若超过127&#xff0c;会不一样printf("%d %d\n",data.at(0),data.at(0)&0xff);…...

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全的详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…...

Redis有哪几种内存淘汰策略?

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享&#xff0c;打开手机app&#xff0c;额外获得1T空间 https://dr…...

操作系统练习:在Linux上创建进程,及查看进程状态

说明 进程在执行过程中可以创建多个新的进程。创建进程称为“父进程”&#xff0c;新的进程称为“子进程”。每个新的进程可以再创建其他进程&#xff0c;从而形成进程树。 每个进程都有一个唯一的进程标识符&#xff08;process identifier&#xff0c;pid&#xff09;。在L…...

Java虚拟机(JVM):垃圾收集算法

目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法 四、标记-整理算法 一、分代收集理论 分代收集理论建立在两个分代假说之上&#xff1a; 1、弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 2、强分代假说&#xff1a;熬过越多次垃圾收集过程的对象就…...

【爬虫】Requests库的使用

这个库比我们上次说的 urllib 可是要牛逼一丢丢的。通过它我们可以用更少的代码&#xff0c;模拟浏览器操作。 不多说&#xff0c;直接上手代码。 requests 常见用法 mport requests# get请求网站 r requests.get(https://www.baidu.com/) # 获取服务器响应文本内容 r.text …...

了解生成对抗网络 (GAN)

一、介绍 Yann LeCun将其描述为“过去10年来机器学习中最有趣的想法”。当然&#xff0c;来自深度学习领域如此杰出的研究人员的赞美总是对我们谈论的主题的一个很好的广告&#xff01;事实上&#xff0c;生成对抗网络&#xff08;简称GAN&#xff09;自2014年由Ian J. Goodfel…...

opencv-人脸关键点定位

#导入工具包 from collections import OrderedDict import numpy as np import argparse import dlib import cv2#https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/ #http://dlib.net/files/# 参数 ap argparse.ArgumentParser() ap.add_argument("-p&quo…...

言语理解与表达 郭熙(一)

40题 35min 逻辑填空 &#xff08;20题&#xff09; 题型&#xff1a;实词填空&#xff1b;成语填空&#xff1b;混搭填空 解题思路 词义辨析&#xff1a;词义侧重&#xff1b;固定搭配&#xff1b;程度较重&#xff1b;感情色彩 语境分析&#xff1a; 关联关系&#xff…...

【stable-diffusion使用扩展+插件和模型资源(上】

文章目录 前言一、插件推荐1.qrcode-monster2.sd-webui-openpose-editor3.sd-webui-depth-lib4.roop&#xff08;换脸插件&#xff09;5.sd-webui-qrcode-toolkit&#xff08;艺术二维码&#xff09;5.光源控制6.二次元转真人7.动态视频转场&#xff08;loopback-wave&#xff…...

面试之快速学习STL-无序关联式容器

和关联式容器一样&#xff0c;无序容器也使用键值对&#xff08;pair 类型&#xff09;的方式存储数据。不过&#xff0c;本教程将二者分开进行讲解&#xff0c;因为它们有本质上的不同&#xff1a; 关联式容器的底层实现采用的树存储结构&#xff0c;更确切的说是红黑树结构&a…...

C++线程库

C线程库是C11新增的重要的技术之一&#xff0c;接下来来简单学习一下吧&#xff01; thread类常用接口 函数名功能thread()构造一个线程对象&#xff0c;没有关联任何线程函数&#xff0c;即没有启动任何线程。thread(fn, args1, args2, ...)构造一个线程对象&#xff0c;并…...

一文看懂群晖 NAS 安装 Mysql 远程访问连接

文章目录 1. 安装Mysql2. 安装phpMyAdmin3. 修改User 表4. 本地测试连接5. 安装cpolar6. 配置公网访问地址7. 固定连接公网地址 群晖安装MySQL具有高效、安全、可靠、灵活等优势&#xff0c;可以为用户提供一个优秀的数据管理和分析环境。同时具有良好的硬件性能和稳定性&#…...

永久设置pip指定国内镜像源(windows内)

1.首先列出国内四个镜像源网站&#xff1a; 一、清华源 https://pypi.tuna.tsinghua.edu.cn/simple/ 二、阿里源 https://mirrors.aliyun.com/pypi/simple 三、中科大源 https://pypi.mirrors.ustc.edu.cn/simple/ 四、豆瓣源 http://pypi.douban.com/simple/ 2.一般下载所需要…...

【SA8295P 源码分析】27 - QNX Ethernet MAC 驱动 之 emac_tx_thread_handler 数据发送线程 源码分析

【SA8295P 源码分析】27 - QNX Ethernet MAC 驱动 之 emac_tx_thread_handler 数据发送线程 源码分析 系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接:《【SA8295P 源码分析】27 - QNX Ethernet MAC 驱动 之 emac_tx_thread_handler() 数据发送线程…...

爬虫抓取数据时显示超时,是代理IP质量不行?

很多人在做数据抓取的时候&#xff0c;会遇到显示超时了&#xff0c;然后就没有响应了。这是什么原因的&#xff1f;有的人回答是使用的代理IP质量不行&#xff0c;这种答案&#xff0c;对也不对。 数据抓取时&#xff0c;出现超时的原因时多方面影响的&#xff0c;主要分为目标…...

【管理运筹学】第 5 章 | 整数规划 (2,割平面法及 0-1 变量的特性)

文章目录 引言三、割平面法四、0-1 型整数规划4.1 0-1 变量的特性4.1.1 投资问题4.1.2 约束条件满足个数问题 写在最后 引言 前文我们介绍了整数规划的一种求解方法——分支定界法&#xff0c;可以求解纯整数和混合整数规划问题。现在我们来学习另一种整数规划求解方法——割平…...

Vscode详细安装教程

Vscode官网下载 官网地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 通过链接可以直接跳转到下面的页面当中&#xff0c;支持的版本有Windows、Linux、Mac&#xff0c;可以选择适配自己电脑的版本&#xff0c;一般来说应该是Windows x64的。不要直接点W…...

法线矩阵推导

法线矩阵推导 https://zhuanlan.zhihu.com/p/72734738 https://juejin.cn/post/7113952418613690382 https://blog.csdn.net/wangjianxin97?typeblog 1、为什么需要法线矩阵 vec3 normalEyeSpace modelViewMatrix * normal;如果模型矩阵执行了非等比缩放, 顶点的改变会导致法…...

对容器、虚拟机和 Docker 的初学者友好介绍

一、说明 如果你是一个程序员或技术人员&#xff0c;你可能至少听说过Docker&#xff1a;一个有用的工具&#xff0c;用于在“容器”中打包&#xff0c;运输和运行应用程序。很难不这样做&#xff0c;这些天它得到了所有的关注 - 来自开发人员和系统管理员。即使是像谷歌、VMwa…...

linux部署clickhouse(单机)

一、下载安装 1.1、下载地址 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区阿里巴巴开源镜像站&#xff0c;免费提供Linux镜像下载服务&#xff0c;拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源&#xff0c;此外还提供域名解析DNS、…...

vue组件注册

组件注册分为全局注册和局部注册 全局注册 在 main.js 或者入口文件中 import { createApp } from vue; import MyComponent from ./components/MyComponent.vue;const app createApp();app.component(my-component, MyComponent);app.mount(#app); 我们首先通过createApp…...

day20 飞机大战射击游戏

有飞行物类 飞行 爆炸 的连环画&#xff0c; 飞行的背景图 &#xff0c; 子弹图&#xff0c; 还有游戏开始 暂停 结束 的画面图。 设计一个飞机大战的小游戏&#xff0c; 玩家用鼠标操作hero飞行机&#xff0c; 射出子弹杀死敌机&#xff0c;小蜜蜂。 敌机可以获得分数&…...

iOS设计规范是什么?都有哪些具体规范

iOS设计规范是苹果为移动设备操作系统iOS制定的设计指南。iOS设计规范的制定保证了苹果应用在外观和操作上的一致性和可用性&#xff0c;从而提高了苹果界面设计的用户体验和应用程序的成功性。本文将从七个方面全面分析iOS设计规范。 1.iOS设计规范完整版分享 由「即时设计」…...

动手学深度学习-pytorch版本(二):线性神经网络

参考引用 动手学深度学习 1. 线性神经网络 神经网络的整个训练过程&#xff0c;包括: 定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型。经典统计学习技术中的线性回归和 softmax 回归可以视为线性神经网络 1.1 线性回归 回归 (regression) 是能为一个或多个…...

织梦转WordPress插件/上海seo外包

本文为荷兰埃因霍温科技大学&#xff08;作者&#xff1a;Bimpisidis, K.&#xff09;的硕士论文&#xff0c;共61页。 随着高效算法和低成本高分辨率CMOS相机的出现&#xff0c;图像处理&#xff08;IP&#xff09;应用变得越来越流行。然而&#xff0c;IP应用是计算密集型的…...

石家庄做网站汉狮网络/2023年7月最新新闻摘抄

缺省情况下&#xff0c;应用程序使用缓冲池 IBMDEFAULTBP&#xff0c;它是在创建数据库时创建的。当 SYSCAT.BUFFERPOOLS 目录表中该缓冲池的 NPAGES 值为 -1 时&#xff0c;DB2 数据库配置参数 BUFFPAGE 控制着缓冲池的大小。否则会忽略 BUFFPAGE 参数&#xff0c;并且用 NPAG…...

wordpress 添加xml/淄博网站营销与推广

Origin软件这个安装记录&#xff0c;在这&#xff0c;以后可能会再用 资源下载 资源在网盘里&#xff0c;安装过程也在里面&#xff0c;解压按照里面的步骤操作 链接&#xff1a;https://pan.baidu.com/s/1BFnxgwDdK8JXKSnjXa3foQ 提取码&#xff1a;nemo 资料来源 B站的一…...

wordpress知识管理系统/网络营销师是干什么的

use the default version...

哪个网站可以做设计比赛/自己如何制作一个网页

题目描述 众所周知&#xff0c;chenzeyu97有无数的妹子(阿掉&#xff01;>_<)&#xff0c;而且他还有很多恶趣味的问题&#xff0c;继上次纠结于一排妹子的排法以后&#xff0c;今天他有非(chi)常(bao)认(cheng)真(zhe)去研究一个奇怪的问题。有一堆他的妹子站成一排&…...

婚纱摄影网站设计模板/百度收录官网

ngx_connection_t结构体 //服务器的被动连接struct ngx_connection_s {//连接未使用时候,data域充当连接链表中的next指针.//当连接被使用时候,data域的意义由模块而定.void *data;//连接对应的读事件ngx_event_t *read;//连接对应的写事件ngx_event_t …...