精华内容
下载资源
问答
  • data structure的定义:More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied...迭代器 定义:迭代器(iterator...

    data structure的定义:More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data.[4]

    迭代器

    定义:迭代器(iterator)提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。
    好处:没有迭代器,如果将便利方法全部塞进容器中,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。如果让用户自己实现容器的遍历倒是省事,却又将容器的内部细节暴露无遗。而迭代器模式的出现,很好的解决了上面两种情况的弊端。
    构成迭代器模式由以下角色组成:

    1. 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
    2. 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
    3. 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
    4. 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色与该容器的结构相关。
      在这里插入图片描述
      implement-实现
      interface-接口

    不可以用cout打印iterator的地址值
    如cout<<ivec.begin();因为没有定义iterator的重载运算符

    如何获得iterator的地址
    一般来说,迭代器是个数据结构,会将真实的数据地址保存在某个内部的成员变量中,并重载各种运算符(比如解引用运算符*)。

    要取得数据地址,使用 &* 或者 std::addressof(iterator)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main(){
    	vector<int> vecInt;
    	for(int i = 10; i != 15; i++){
    		vecInt.push_back(i);
    	}
    	
    	//address of iter and end
    	vector<int>::iterator iter = vecInt.begin();
    	while(iter != vecInt.end()){
    		cout << "addr of iter: " << &*iter << ", addr of end: " << &*vecInt.end() << endl;
    		iter++;
    	}
    	
    	return 0;
    }
    --------------------- 
    作者:emmmzhang 
    来源:CSDN 
    原文:https://blog.csdn.net/hl_zzl/article/details/84575713 
    
    展开全文
  • &*iterator 或 std::addressof(*iterator)

    &*iteratorstd::addressof(*iterator)

    展开全文
  •     std::swap()函数有一个缺点:无法交换2个迭代器的值,一开始想要交换一个vector中的两个元素,我是这么写的: struck MyData { ………… } std::vector<MyData> vecTemp; for(…………) { vecTemp赋值。...

        std::swap()函数有一个缺点:无法交换2个迭代器的值,一开始想要交换一个vector中的两个元素,我是这么写的:
    struck MyData
    {
    …………
    }

    std::vector<MyData> vecTemp;
    for(…………)
    {
    	vecTemp赋值。。。。
    }
    vecTemp::iterator itorTemp = vecTemp.begin();
    if(……)
    {
    	std::swap(itorTemp ,vecTemp.begin());
    }
    

        但是发现swap函数不能交换iterator,然后找到了函数iter_swap。如果使用iter_swap函数,那么就可以进行交换了,先看一下函数的参数:
    iter_swap(a,b);//a为一个迭代器,b为另一个迭代器。顾名思义,iter_swap的功能就是交换两个迭代器的元素。

    展开全文
  • 在使用vector时,使用*iterator可以读出迭代器指向vector中的值,那如果想读出iterator的地址,该怎么表示呢? 思考 对于常规的指针而言,可以用int *ptr来表示一个指向整型变量的指针,*ptr即指向整型变量的值,ptr...

    在使用vector时,使用*iterator可以读出迭代器指向vector中的值,那如果想读出iterator的地址,该怎么表示呢?

    思考

    对于常规的指针而言,可以用int *ptr来表示一个指向整型变量的指针,*ptr即指向整型变量的值,ptr即地址
    代码如下

    #include <iostream>
    using namespace std;
    
    int main(){
    	int i = 123;
    	int *ptr;
    	ptr = &i;
    	
    	cout << "i: " << i << ", address of i: " << &i << endl;
    	cout << "*ptr: " << *ptr << ", ptr: " << ptr << endl;
    	
    	return 0;
    }
    

    打印的结果和预期是一样的
    在这里插入图片描述


    尝试去获取iterator的地址

    Demo

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main(){
    	vector<int> vecInt;
    	for(int i = 10; i != 15; i++){
    		vecInt.push_back(i);
    	}	
    	//show all elements
    	cout << "show all elements: " << endl;
    	for(int i : vecInt){
    		cout << i << " ";
    	} 
    
    	//address of iter and end
    	vector<int>::iterator iter = vecInt.begin();
    	while(iter != vecInt.end()){
    		/*
    		
    		want to get the address of iterator
    		
    		cout << "address of iter: " << ??? << ", address of end: " << ??? << endl;
    
    		*/
    		iter++;
    	}
    
    	return 0;
    }
    

    在代码中,遍历这个vector,并打印出每个iterator的地址,如果使用和指针类似的写法,如下代码:

    vector<int>::iterator iter = vecInt.begin();
    while(iter != vecInt.end()){
    	iter = vecInt.erase(iter);
    	cout << "addr of iter: " << iter << ", addr of end: " << vecInt.end() << endl;
    }
    

    编译器会报错:[Error] cannot bind ‘std::basic_ostream’ lvalue to ‘std::basic_ostream&&’
    在这里插入图片描述
    那么应该如何获取呢?


    获取iterator的地址

    一般来说,迭代器是个数据结构,会将真实的数据地址保存在某个内部的成员变量中,并重载各种运算符(比如解引用运算符*)

    要取得数据地址,使用 &* 或者 std::addressof(*iterator)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main(){
    	vector<int> vecInt;
    	for(int i = 10; i != 15; i++){
    		vecInt.push_back(i);
    	}
    	
    	//address of iter and end
    	vector<int>::iterator iter = vecInt.begin();
    	while(iter != vecInt.end()){
    		cout << "addr of iter: " << &*iter << ", addr of end: " << &*vecInt.end() << endl;
    		iter++;
    	}
    	
    	return 0;
    }
    

    通过使用 &*iter来获取迭代器的地址
    在这里插入图片描述

    展开全文
  • 文章目录一、迭代器失效问题二、如何解决迭代器失效问题三、迭代器失效底层原理 一、迭代器失效问题 迭代器的失效问题:对容器的操作影响了元素的存放位置,称为迭代器失效。 失效情况: 1.当容器调用erase()方法后...
  • 迭代器

    2018-05-21 18:43:34
    迭代去更为抽象,它可以指向容器中的一个位置,我们不必关心这个位置对应的真正物理地址,只需要沟通过迭代器访问这个位置的元素。STL中迭代器是算法和容器的中间人。STL的每一个容器类模板中,都定义了一组对应的...
  • 迭代器赋初值

    2017-11-22 10:23:05
    class CheckedOutBook { public: ...迭代器实际上是一个嵌套的类型 ,由于它没有带一个指针参数并且允许隐式转换的构造函数,当然不能赋以指针值.但可以调用它的 默认构造函数 作为参数的默认 值
  • Python 迭代器、生成器

    2020-04-22 16:14:12
    文章目录一、可迭代对象二、迭代器三、可迭代对象与迭代器对比四、生成器通过生成器函数构建生成器通过推导式构建生成器 一、可迭代对象 字面意思: 对象:Python 中一切皆为对象(巧了 Java 也是(手动滑稽)) ...
  • Iterator<Goods> it=goodsMap.values().iterator(); while(it.hasNext()) { ...输出结果为set里对象的地址 解决办法:在类里重写toString()方法即可,快速重写:右键,source,Generate toString()… ...
  • 没有错误的模板,只有错误的逻辑,少思考一步,那些模板中的东西就可能会产生错误的结果,就比如一个iterator的迭代器,他就存在一个失效的问题
  • 不能直接取迭代器地址迭代器加*,即获得该迭代器所指的元素 对迭代器加*,再加&,就是该元素的地址 #include <vector> #include <iostream> using namespace std; int main(int argc, char ...
  • C++中容器迭代器解引用运算符

    千次阅读 2021-11-11 17:00:09
    在《C++中容器迭代器的基本使用方法1》中提到,迭代器的ptr变量实际上就是一个指针,该指针指向了迭代器表示的元素。因此,在容器迭代器中使用解引用运算符,与在指针上使用解引用运算符类似,其的作用是返回该迭代...
  • Android迭代器模式demo

    2016-04-13 16:53:36
    Android迭代器模式demo,同步文章地址:http://blog.csdn.net/qq_28690547/article/details/51143529
  • 迭代器与vector向量容器的用法 迭代器 实际上,能够 遍历 一个 容器 的 工具 都可以称作是 迭代器。 分为正向迭代器和反向迭代器。...迭代器实质上是指针,也就是指向的数据的地址,因此会有【迭代
  • Python生成器,迭代器,装饰器

    千次阅读 2019-02-12 14:44:13
    #什么是生成器? 使用了yield的函数就被称之为生成器,生成器是一个返回迭代器的函数,说白了生成器就是迭代器,只能用于迭代操作
  • c++ 迭代器++和+1_C ++中的迭代器简介

    千次阅读 2020-07-06 20:04:52
    c++ 迭代器++和+1In this article, we’ll learn about Iterators in C++ in detail. While working with data elements, we often come across situations where we need to traverse through every element of the...
  • 迭代器的方法: hasNext()----判断是否有元素,如果有元素可以迭代,返回true,则返回false next()----- 返回迭代的下一个元素 第一步:获取集合对象的迭代器对象 Connection al=new ArrawList(); 创建一个...
  • 详解C# 迭代器

    2018-08-18 15:05:03
    迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式。简单来说,迭代器模式使得你能够获取到序列中的所
  • 1、迭代器不仅仅是指针 可以指向容器中的一个位置,通过迭代器访问这个位置的元素,而不必关心这个位置对应的是真正的物理地址  2、迭代器是算法和容器的“中间人”  3、迭代器对存储在容器中的元素序列进行遍历...
  • C++ 迭代器iterator和指针

    千次阅读 2020-03-12 21:11:35
    2.指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离 3.通过指针或者iterator都能够修改其指向的元素 不同之处 指针是C语言里面就有的东西,而迭代器...
  • 文章目录1 摘要2 遍历迭代器2.1 传统遍历方式2.2 Java 8 使用 Lambda 遍历迭代器3 Gtihub 源码 1 摘要 迭代器(Iterator) 是遍历集合类的重要工具。本文将介绍迭代器的旧迭代方法以及在 Java 8 下使用 Lambda 表达式...
  • 迭代器与可迭代对象

    2019-03-15 16:20:31
    迭代器与可迭代对象 概念 迭代器:是访问数据集合内元素的一种方式,一般用来遍历数据,但是它不能像列表一样使用下标来获取数据,也就是说迭代器是不能返回的。 Iterator:迭代器对象,必须要实现next魔法函数...
  • C++迭代器

    2017-06-14 17:07:16
    C++迭代器
  • 关于迭代器失效的几种情况

    万次阅读 多人点赞 2018-07-22 23:32:00
    之前就做题的时候就经常碰到与迭代器失效有关的问题,但是一直对这个问题也没有深究,处于似懂非懂的状态,今天就对迭代器失效这部分知识做一个总结。 迭代器 迭代器(iterator)是一个可以对其执行类似指针的操作...
  • C++迭代器(iterator)

    2021-07-30 16:54:10
    可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。这和我们所熟知的指针极其类似。 C语言有指针,指针用起来十分灵活高效。 C++语言有迭代器迭代器相对于指针而言功能更为丰富。 vector,是数
  • 但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。例如,一个数组索引,也可以认为是一种迭代器迭代器有各种不同的创建方法。程序可能把迭代器作为一个变量创建。一个STL容器类可能为了使用一个特定...
  • STL list迭代器

    2020-09-20 12:17:53
    STL list中迭代器 1.链表的结构 链表的结构: 每一个链表上的节点都有三个部分:前指针,值,后指针 分别说明一下这三者的作用: 前指针(pre):指向前一个节点的值 后指针(next):指向后一个节点的值 值:节点上...
  • 迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你...
  • 五、迭代器--迭代器类型详述

    千次阅读 2017-08-16 15:47:13
    五、迭代器标签(空格分隔): c++STL1. 迭代器及其特性 迭代器本身就是一种对象 迭代器不是通用指针,而是指向数组的指针概念的抽象 迭代器就是一个指示器 迭代器能够使程序反复得对stl容器内容进行访问,当参数化...
  • 迭代器和指针的区别

    2019-05-30 14:13:06
    迭代器: (1)迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->,*,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,293
精华内容 62,517
关键字:

迭代器地址