如何理解c++迭代器(上)
1、如何理解迭代器?迭代器不是指针,也似乎不是string这种类型
参考:迭代器与指针的区别是? C++map迭代器的++操作是如何实现的?讨论。iterator提供了遍历STL容器里元素的方式,not-only-read,还可以修改这些元素,如赋值,这需要解引用操作返回的是元素的左值引用。
考虑pointer遍历数组和链表,前者p++,后者p=p->next,而iterator提供了抽象的统一操作iterator++。STL里的各种容器实现细节不一样(内存管理不一样,如string就有三种实现方式),如果用指针去遍历,需要像容器的实现者那样了解各种细节,访问形式也是不一致。所以迭代器提供了更直观更好用的方式 acess elements in Containers。
2、forward_list的迭代器为什么和vector的迭代器不一样?见c++ primer 5th
类比指针的算术运算,迭代器需要支持的操作?++、--、*、+n、-n、=、==、!=。forward_list的迭代器不支持+n操作,因为这提供了对元素的随机访问能力,而前向链表实现的是单链表的功能,所以不能提供。iterator、迭代器的五种类型、随机访问迭代器。
3、如何实现一个迭代器,如果自定义了容器类型,需要完成那些工作STL自带的迭代器能访问元素?
为什么C++ STL的迭代器要嵌套在容器之中?因为容器的实现方式不一样。
自定义一个容器类,如何引入迭代器机制?define iterator?具体迭代器的实现可参考《STL源码剖析》。
如何理解c++迭代器(上)的更多相关文章
- 深入理解Java虚拟机--上
深入理解Java虚拟机--上 第2章 Java内存区域和内存溢出异常 2.2 运行时数据区域 图 2-1 Java虚拟机运行时数据区 2.2.1 程序计数器 程序计数器可以看作是当前线程所执行的字节码 ...
- 怎么理解Python迭代器与生成器?
怎么理解Python迭代器与生成器?在Python中,使用for ... in ... 可以对list.tuple.set和dict数据类型进行迭代,可以把所有数据都过滤出来.如下: ...
- Java基础(47):插入排序的Java封装(含原理,可运行,哨兵位的理解见VisualGo上面的动态分析)
直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使 ...
- 【底层原理】深入理解Cache (上)
存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小.寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级,有L1,L2等缓存),再 ...
- 谈谈对C#中反射的一些理解和认识(上)
今天就平常用到的非常多的反射这个技术来做一个总结,当然关于反射需要讲解的东西实在是太多的内容,在一片文章中想要讲解清楚是非常难的,本篇博客也是就自己本人对这些内容学习后的一个总结,当然包括看书和自己写 ...
- 对cpu与load的理解及线上问题处理思路解读
前言 2019双11还有不到2个月就要到来了,大家也都知道服务器在大促期间由于流量的增加势必导致机器的cpu与load变高.因此趁着这个时机正好再好好学习.巩固一下cpu和load的概念,为双11做准 ...
- 深入理解defer(上)defer基础
深入理解 defer 分上下两篇文章,本文为上篇,主要介绍如下内容: 为什么需要 defer: defer 语法及语义: defer 使用要点: defer 语句中的函数到底是在 return 语句之 ...
- 深度理解Python迭代器
迭代器 迭代是什么 迭代指的是一个重复的过程,每次重复都必须基于上一次的结果而继续,单纯的重复并不是迭代,如Python中的for循环就是一个非常好的迭代例子. for item in range(1 ...
- 对cpu与load的理解及线上问题处理思路
cpu如何计算 当我们执行top命令的时候,看到里面的值(主要是cpu和load)值是一直在变的,因此有必要简单了解一下Linux系统中cpu的计算方式. cpu分为系统cpu和进程.线程cpu,系统 ...
随机推荐
- 【Python—参数】*arg与**kwargs参数的用法
在python中,这两个是python中的可变参数,*arg表示任意多个无名参数,类型为tuple;**kwargs表示关键字参数,为dict. # *允许你传入0个或任意个参数,这些可变参数在函数调 ...
- python面试题之Python如何实现单例模式?
#使用__metaclass__(元类)的高级python用法 class Singleton2(type): def __init__(cls, name, bases, dict): super( ...
- [转]ORACLE优化器RBO与CBO的区别
RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...
- Linux笔记1-简介
以下为观看兄弟连视频教程所记. 1.简介 1965年,MIT.GE.AT&T的贝尔实验室 --> Multics 分时.庞大 1969年,贝尔实验室的肯·汤普森 --> Unix ...
- 20191114PHP验证码
<?phpob_clean();$img=imagecreate(40,20);$back=imagecolorallocate($img,200,200,200); $blue=imageco ...
- Linux拷贝、移动、删除
cp:拷贝文件或文件夹(copy) - cp original_filename copy_filename(在当前目录生成拷贝文件,并改名为copy_filename) - cp original_ ...
- spring-boot-shiro-jwt-redis实现登陆授权功能
一.前言 在微服务中我们一般采用的是无状态登录,而传统的session方式,在前后端分离的微服务架构下,如继续使用则必将要解决跨域sessionId问题.集群session共享问题等等.这显然是费力不 ...
- ZYNQ跑系统 系列(二) petalinux方式移植linux
三.搭建petalinux工程 0.定位目录 先在shell中找一个准备存放工程的地方,(我的是home/hlf/PRO),命令行cd home/hlf/PRO 1.定位编译链 根据安装p ...
- 唐太宗灵州勒石 TANGTAIZONGLINZHOULESHI
唐太宗灵州勒石 唐贞观二十年(646年),在唐军和回纥部落联合打败突厥薛延陀部后,原归附薛延陀部的回纥.拔野古.斛薛等部族,越过贺兰山,进入了今宁夏的银川.吴忠一带地区.这些总族向唐朝提出,愿意臣服唐 ...
- 【leetcode】883. Projection Area of 3D Shapes
题目如下: 解题思路:分别求出所有立方体的个数,各行的最大值之和,各列的最大值之和.三者相加即为答案. 代码如下: class Solution(object): def projectionArea ...