迭代器

自学QT之QListIterator迭代器的示例

匿名 (未验证) 提交于 2019-12-03 00:03:02
#include < QCoreApplication > #include < QList > #include < QDebug > int main ( int argc , char * argv []) { QCoreApplication a ( argc , argv ); QList <int> mylist ; for ( int i = 0 ; i < 10 ; i ++) { mylist . append ( i ); } QListIterator <int> myiter ( mylist ); while ( myiter . hasNext ()) { qDebug ()<< myiter . next (); } return a . exec (); } 这是一个使用 QListIterator 迭代器的示例。 QListIterator 是一个java风格的迭代器,可以实现遍历输出list的内容。 QListIterator 的函数有: QListIterator(const QList<T> & list) bool findNext(const T & value) bool findPrevious(const T & value) bool hasNext() const bool hasPrevious() const const T

关于STL迭代器中Traits编程方法的学习总结

匿名 (未验证) 提交于 2019-12-02 23:56:01
迭代器的相应类型value_type,例:vector<int>::iterator it;迭代器it的类型实际为int *,而这里迭代器的相应类型是指int,,即这里迭代器的相应类型是指迭代对象的类型。 在使用迭代器时,有时可能需要使用迭代器的相应类型value_type,例如当某函数中使用迭代器,需要返回value_type类型的值,而此时我们只知道迭代器的类型,怎么获得该迭代器的value_type? STL中解决该问题方法: 在STL中定义迭代器时,同时有声明内嵌类型value_type,即: 1 template <class T> 2 struct iterator { 3 typedef T value_type; //声明内嵌类型value_type 4 T *ptr; 5 }; 这样在上述需求时可类似如下使用: 1 template <class I> 2 typename I::value_type //返回值类型 3 func_exp(I iter) { 4 return *iter; 5 } 但当原生指针作为迭代器时,我们无法为其声明内嵌类型 value_type,因为我们没有该迭代器的定义。 即出现两种情况,原生指针作为迭代器和自定义 class type 迭代器,获得其value_type时不可以同一种方法获得。 这时可使用 traits 编程技巧

常用算法

匿名 (未验证) 提交于 2019-12-02 23:56:01
排序普通类型 bool complare(int a, int b) { return a < b; // 从小到大, 形参顺序不变, 看大小号判断排序顺序 return a > b; // 从大到小 } int a[10] = { 1, 7, 4, 0, 9, 4, 8, 8, 2, 4 }; sort(a, a + 10); // 数组长度 sort(a, a + 10, complare); 排序vector bool complare(int a, int b) { return a > b; } vector<int> vt; for (int i = 0; i < 10; i++) { vt.push_back(static_cast<int>(rand() % 10)); } for (auto v : vt) cout << v << " "; cout << endl; sort(vt.begin(), vt.end(), complare); for (auto v : vt) cout << v << " "; cout << endl; myClass c1, c2; swap(c1, c2); int a = 1, b = 2; cout << max(a, b) << ' ' << endl; cout << min(a, b) << ' ' <<

STL之迭代器

匿名 (未验证) 提交于 2019-12-02 23:49:02
迭代器:     类似于指针类型,迭代器也提供了对对象的间接访问,就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素,迭代器有有效和无效之分,这一点和指针差不多     有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一位置     使用迭代器和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员,譬如这些类型都拥有名为begin和end的成员,     其中begin成员负责返回指向第一个元素(或第一个字符)的迭代器;end成员则负责返回指向容器“尾元素的下一位置”的迭代器,也就是说,     该迭代器指示的是容器的一个本不存在的“尾后元素”,这样的迭代器没什么意义,仅是个标记而已,表示我们处理完了容器中的所有元素     end成员返回的迭代器常被称为尾后迭代器或者简称为尾迭代器,特殊情况下,如果容器为空,那么begin和end返回的是同一个迭代器 举例:   std::vector<int> data;   data.push_back(1);   data.push_front(2);   data.push_back(3);   data.push_front(4);   std::vector<int>::iterator iter;   for

迭代器、生成器

匿名 (未验证) 提交于 2019-12-02 23:49:02
什么是迭代器? 迭代:更新换代的过程,也是一个重复的过程,每一次的迭代都必须基于上一次的结果(迭代与迭代之间必须要有关系) 迭代器:迭代取值的工具 为什么要用迭代器? 迭代器给提供了一种不依赖于索引取值的方式 需要迭代取值的数据类型:字符串、列表、元组、字典、集合 l = [1,2,3,4] n = 0 while n < len(1): print(l[n]) n += 1 #重复+,每次迭代都是基于上一次的结果而来的      可迭代对象 只要内置有__iter__方法的都叫做可迭代对象 补充:针对双下划线开头双下划线结尾的方法,推荐读双下+方法名 基本数据类型中可迭代对象的:str、list、tuple、dict、set、 文件对象(执行内置的__iter__之后还是本身,没有任何变化),文件对象本身就是迭代器对象。 可迭代对象执行内置的__iter__方法得到就是该对象的迭代器对象 迭代器取值 迭代器对象: 1、内置有__iter__方法 迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身 2、内置有__next__方法 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象 可迭代对象:内置有__iter__方法的 迭代器对象:既内只有__iter__也内置有__next__方法 迭代取值: 优点: 1、不依赖于索引取值 2、内存中永远只占一份空间

插入、流和反向迭代器

寵の児 提交于 2019-12-02 23:44:59
目录 插入迭代器 类型和不同 example 流迭代器 类型和要求 创建方式 反向迭代器 类型和操作 example 插入迭代器 类型和不同 用于向容器插入元素,一共有三种,back_inserter,front_insert和inserter; back_inserter需要容器支持push_back,功能就是创建一个使用push_back的迭代器, 元素插入到之后 。 front_inserter需要容器支持front_back,功能创建一个能使用push_front的迭代器, 元素会被插入到容器首部 。 inserter接受两个参数,创建一个使用insert的迭代器, 元素会被插入到给定迭代器的元素之前 。 example #include<bits/stdc++.h> using namespace std; void print(list<int>v) { for_each(v.cbegin(), v.cend(), [](int a) {cout << a << " "; }); cout << endl; } int main(void) { list<int>vec{1,1,1,2,2,2,3,3,3}; list<int>v1{ 666,777 }, v2, v3, v4; v3 = v4 = v1; unique_copy(vec.cbegin(), vec

接口Iterator

匿名 (未验证) 提交于 2019-12-02 23:43:01
Iterator接口 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator。Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而I terator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。 想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下 获取迭代器的方法: public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。 什么是迭代 迭代: 即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。 Iterator接口的常用方法如下: public E next():返回迭代的下一个元素。 public boolean hasNext():如果仍有元素可以迭代,则返回 true。 代码举例 package demo01; import java.util.ArrayList; import java.util.Collection;

迭代器模式Iterator Pattern

匿名 (未验证) 提交于 2019-12-02 23:43:01
把迭代的思想抽象为一种行为,从集合分离出来,使迭代的使用与集合本身的存储结构解耦 例如 java中每个序列类的存储结构,只要调用.iterator方法,都会返回一个Iterator类的对象 转载请标明出处: 迭代器模式Iterator Pattern 文章来源: https://blog.csdn.net/qq_42192818/article/details/92632336

Qt容器类之二:迭代器

匿名 (未验证) 提交于 2019-12-02 23:43:01
遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目。Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器。 如果只是想按顺序遍历一个容器中的项目,那么还可以使用Qt的foreach关键字。 Java风格的迭代器在Qt4中加入,比STL风格的迭代器更易于使用,但是以轻微的效率作为代价, 它们的API以Java的迭代器类为模型。 对于每个容器类,都有两种Java风格的迭代器类型:一种是只读,另一种是可读写。 容器 只读迭代器 可读写迭代器 QList<T>, QQueue<T> QListIterator<T> QMutableListIterator<T> QLinkedList<T> QLinkedListIterator<T> QMutableLinkedListIterator<T> QVector<T>, QStack<T> QVectorIterator<T> QMutableVectorIterator<T> QSet<T> QSetIterator<T> QMutableSetIterator<T> QMap<Key, T>, QMultiMap<Key, T> QMapIterator<Key, T> QMutableMapIterator<Key, T> QHash<Key, T>,

Python 迭代器

匿名 (未验证) 提交于 2019-12-02 22:56:40
1、迭代器定义   迭代器只不过是一个实现了迭代器协议的 容器对象 。它基于两个方法:   __iter__  返回迭代器本身 2、内建函数iter()   迭代器可以通过内置函数iter()和一个序列创建: it = iter( ‘ abc ‘ ) print it.next() print it.next() print it.next() print it.next() a b c Traceback (most recent call last): File " f:\test\iter.py " , line 7, in <module> print it.next() StopIteration   当序列遍历完时,将抛出StopIteration异常,这使迭代器和循环兼容,因为它们将捕获这个异常而停止循环。 3、生成定制迭代器   要创建定制迭代器,编写一个具有next()方法的类,只要该类提供返回迭代器实例的__iter__()方法即可。 class MyIterator(object): def __init__ (self, step): self.step = step def next(self): if self.step == 0: raise StopIteration self.step -= 1 return self.step def _