什么是C++的迭代器

合集下载

c+遍历map的方法

c+遍历map的方法

在C++中,可以使用迭代器(iterator)或基于范围的for循环来遍历map。

1. 使用迭代器遍历map:```cpp#include <iostream>#include <map>using namespace std;int main() {map<string, int> myMap;myMap["one"] = 1;myMap["two"] = 2;myMap["three"] = 3;// 使用迭代器遍历mapfor (map<string, int>::iterator it = myMap.begin(); it != myMap.end(); it++) {cout << "Key: " << it->first << ", Value: " << it->second << endl;}return 0;}```2. 使用基于范围的for循环遍历map:```cpp#include <iostream>#include <map>using namespace std;int main() {map<string, int> myMap;myMap["one"] = 1;myMap["two"] = 2;myMap["three"] = 3;// 使用基于范围的for循环遍历mapfor (const auto &pair : myMap) {cout << "Key: " << pair.first << ", Value: " << pair.second<< endl;}return 0;}```在这两种方法中,迭代器遍历map可以更灵活地访问元素,而基于范围的for循环则更简洁。

c++ map迭代器原理

c++ map迭代器原理

c++ map迭代器原理在C++ 中,`std::map` 是一种关联容器,用于存储键值对,并按照键的顺序进行排序。

迭代器是一种用于访问容器元素的对象,可以通过迭代器来遍历和操作容器的内容。

在`std::map` 中,迭代器的底层实现是红黑树(Red-Black tree)。

红黑树是一种自平衡的二叉查找树,它通过保持一些特定的性质来保证树的平衡。

`std::map` 的迭代器可以分为两种类型:`const_iterator` 和`iterator`。

`const_iterator` 用于访问和遍历容器中的元素,并且不允许修改元素的值;`iterator` 除了可以访问和遍历元素之外,还可以修改元素的值。

迭代器的原理如下:1. 迭代器的底层实现是一个指向节点的指针。

每个节点包含一个键值对,以及指向左子节点和右子节点的指针。

2. 在迭代器的初始化过程中,会将指针指向红黑树的根节点。

3. 通过迭代器的操作,可以在红黑树中按照特定的顺序遍历节点。

4. 迭代器的`operator++` 操作会将指针移动到下一个节点,即按照键的顺序遍历红黑树。

5. 通过访问迭代器指向的节点,可以获取节点的键和值等信息。

6. 迭代器的其他操作,如`operator*`、`operator->` 等,可以访问节点的键和值。

需要注意的是,当修改`std::map` 的元素时,可能会导致红黑树的结构发生变化,从而使之前获取的迭代器失效。

为了避免此类问题,应该避免在循环中同时修改和遍历容器。

总结起来,C++ 中的`std::map` 迭代器通过红黑树的底层实现,提供了访问和遍历容器元素的功能。

你可以使用迭代器来遍历`std::map` 中的键值对,并进行相关操作。

如何使用Glib工具集管理C数据

如何使用Glib工具集管理C数据

如何使用GLib 工具集管理C 数据glib不是一个学院派的东西,也不是凭空想出来的,完全是在开发gtk+的过程中,慢慢总结和完善的结果。

如果你是一个工作3年以上的C语言程序员,现在让你讲讲写程序的苦恼,你可能有很多话要说,但如果你有时间研究一下glib,你会发现,很多苦恼已不再成其为苦恼,glib里很多东西正是你期望已经久的。

gobject是glib的精粹,glib是用C实现的,但在很大程序是基于面向对象思想设计的,gobject是所有类的基类。

signal在其中也是一大特色,signal与操作系统中的signal并不一样,它是类似消息一样的东西,让消息在各个对象间传递,但尽量降低对象间的耦合。

仔细读一下它的代码,唯一想说的话就是“绝!”。

动态数组、链表、哈希表等通用容器,在不同的公司,在不同的时期,在不同的情况下,我们每个人对每一种容器,可能都实现过N次以上。

甚至在同一个项目里,出现几份链表的实现,也并非罕见。

一直在抱怨,标准C中为什么没有类似于STL的标准容器,让全世界的程序员在数以万次的重复实现它们。

不过,还算走运,有了glib,恶梦在此终结了。

glib 提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器,完全是面向对象设计的,实现得非常精致。

不用白不用,别客气了。

组织数据GLib 的范畴首先研究GLib 的范畴。

GLib 是一个提供了很多实用定义和函数的底层程序库,包括基本类型及其限定的定义、标准宏、类型转化、字节次序、内存分配、警告与断言、消息日志、计时器、字符工具、钩子函数、词法扫描器、模块的动态加载,以及自动的字符串补齐。

GLib 还定义了很多数据结构(以及它们相关的操作),包括:内存块(Memory chunks)双向链表(Doubly-linked lists)单向链表(Singly-linked lists)散列表(Hash tables)字符串(Strings,可以动态增长)字符块(String chunks,成组的字符串)数组(Arrays,当增加元素时其大小能够增长)平衡二叉树(Balanced binary trees)N-叉树(N-ary trees)Quarks(字符串和唯一整型标识符的双向关联)有关键字的数据列表(Keyed data lists,通过字符串或者整型id 访问其数据元素的列表)关系(Relations)和元组(tuples)(可以由任意数目的域进行索引的数据表)缓存组织数据GLib 的范畴首先研究GLib 的范畴。

C++程序设计(谭浩强完整版)

C++程序设计(谭浩强完整版)

STL算法
STL算法概述
STL算法是C标准模板库中的一组 函数模板,用于对STL容器中的
数据进行操作。
STL算法的分类
STL算法可以分为排序算法和搜 索算法两类,排序算法包括sort、
stable_sort等,搜索算法包括 find、binary_search等。
STL算法的特点
STL算法具有高效、通用和易用 的特点,可以用于各种STL容器, 并且提供了多种可选的参数和功
继承与多态
总结词
继承是面向对象编程中的一个重要概念,它 允许一个类继承另一个类的属性和方法。多 态则是允许一个接口被多种数据类型实现。
详细描述
继承是面向对象编程中的一个重要概念,它 允许一个类继承另一个类的属性和方法。通 过继承,子类可以拥有父类的所有属性和方 法,并且可以扩展或覆盖父类的行为。多态 则是允许一个接口被多种数据类型实现。在 C中,多态可以通过虚函数和纯虚函数实现 ,使得子类可以以自己的方式实现父类的接
C++程序设计(谭浩强完整版)
目录
• C程序设计概述 • C基础知识 • C面向对象编程 • C标准库与STL • C高级特性 • C实践项目 • 总结与展望
01 C程序设计概述
C的发展历程
起源
C由Bjarne Stroustrup于1983年 在Bell Labs开发,作为C语言的 扩展,旨在提供面向对象编程的
05 C高级特性
内存管理
内存分配
C提供了多种内存分配方式,包括静态内存分配和动态内 存分配。静态内存分配在编译时完成,而动态内存分配在 运行时完成。
内存释放
C提供了delete和free函数来释放动态分配的内存,避免 内存泄漏。

CC++STL ATL WTL之间的联系和区别

CC++STL ATL WTL之间的联系和区别

【C/C++】STL,ATL,WTL之间的联系和区别STL即 Standard Template Library (标准模板库)STL是惠普实验室开发的一系列软件的统称。

它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。

现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map 等,STL也是算法和其他一些组件的集合。

这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。

STL的目的是标准化组件,这样你就不用重新开发它们了。

你可以仅仅使用这些现成的组件。

STL现在是C++的一部分,因此不用额外安装什麽。

它被内建在你的编译器之内。

因为STL的list是一个简单的容器,所以我打算从它开始介绍STL如何使用。

如果你懂得了这个概念,其他的就都没有问题了。

另外,list容器是相当简单的,我们会看到这一点。

这篇文章中我们将会看到如何定义和初始化一个list,计算它的元素的数量,从一个list里查找元素,删除元素,和一些其他的操作。

要作到这些,我们将会讨论两个不同的算法,STL通用算法都是可以操作不止一个容器的,而list 的成员函数是list容器专有的操作。

STL容器可以保存对象,内建对象和类对象。

它们会安全的保存对象,并定义我们能够操作的这个对象的接口。

放在蛋架上的鸡蛋不会滚到桌上。

它们很安全。

因此,在STL容器中的对象也很安全。

我知道这个比喻听起来很老土,但是它很正确。

STL算法是标准算法,我们可以把它们应用在那些容器中的对象上。

C++迭代器的使用和操作总结

C++迭代器的使用和操作总结

C++迭代器的使⽤和操作总结 迭代器是⼀种检查容器内元素并遍历元素的数据类型。

C++更趋向于使⽤迭代器⽽不是下标操作,因为标准库为每⼀种标准容器(如vector)定义了⼀种迭代器类型,⽽只⽤少数容器(如vector)⽀持下标操作访问容器元素。

⼀.定义和初始化 每种容器都定义了⾃⼰的迭代器类型,如vector:vector<int>::iterator iter; //定义⼀个名为iter的变量 每种容器都定义了⼀对名为begin和en的函数,⽤于返回迭代器。

下⾯对迭代器进⾏初始化操作:vector<int> ivec;vector<int>::iterator iter1=ivec.bengin(); //将迭代器iter1初始化为指向ivec容器的第⼀个元素vector<int>::iterator iter2=ivec.end(); //将迭代器iter2初始化为指向ivec容器的最后⼀个元素的下⼀个位置 注意end并不指向容器的任何元素,⽽是指向容器的最后元素的下⼀位置,称为超出末端迭代器。

如果vector为空,则begin返回的迭代器和end返回的迭代器相同。

⼀旦向上⾯这样定义和初始化,就相当于把该迭代器和容器进⾏了某种关联,就像把⼀个指针初始化为指向某⼀空间地址⼀样。

⼆.常⽤操作 下⾯列出了迭代器的常⽤运算操作:*iter //对iter进⾏解引⽤,返回迭代器iter指向的元素的引⽤iter->men //对iter进⾏解引⽤,获取指定元素中名为men的成员。

等效于(*iter).men++iter //给iter加1,使其指向容器的下⼀个元素iter++--iter //给iter减1,使其指向容器的前⼀个元素iter--iter1==iter2 //⽐较两个迭代器是否相等,当它们指向同⼀个容器的同⼀个元素或者都指向同同⼀个容器的超出末端的下⼀个位置时,它们相等iter1!=iter2 假设已经声明⼀个vector<int>的ivec容器,下⾯⽤迭代器来遍历ivec容器,把其每个元素重置为0:for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)*iter=0; 在C++定义的容器类型中,只有vector和queue容器提供迭代器算数运算和除!=和==之外的关系运算:iter+n //在迭代器上加(减)整数n,将产⽣指向容器中钱前⾯(后⾯)第n个元素的迭代器。

C语言设计模式

C语言设计模式

目录1.C语言设计模式(开篇) (2)2.C语言和设计模式(继承、封装、多态) (3)2.1继承性 (3)2.2封装性 (4)2.3多态 (4)3.单件模式 (4)4.工厂模式 (5)5.抽象工厂模式 (6)6.访问者模式 (8)7.状态模式 (9)8.命令模式 (9)9.解释器模式 (10)10.备忘录模式 (11)11.观察者模式 (12)12.桥接模式 (12)13.建造者模式 (13)14.中介者模式 (14)15.策略模式 (15)16.适配器模式 (16)17.装饰模式 (17)18.亨元模式 (17)19.代理模式 (18)20.外观模式 (19)21.迭代器模式 (20)22.责任链模式 (21)23.模版模式 (22)24.组合模式 (24)25.原型模式 (25)1.C语言设计模式(开篇)关于软件设计方面的书很多,比如《重构》,比如《设计模式》。

至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。

随着时间的推移,很多的方法又会被重新提出来。

其实,就我个人看来,不管什么方法都离不开人。

一个人写不出二叉树,你怎么让他写?敏捷吗?你写一行,我写一行。

还是迭代?写三行,删掉两行,再写三行。

项目的成功是偶然的,但是项目的失败却有很多原因,管理混乱、需求混乱、设计低劣、代码质量差、测试不到位等等。

就软件企业而言,没有比优秀的文化和出色的企业人才更重要的了。

从软件设计层面来说,一般来说主要包括三个方面:(1)软件的设计受众,是小孩子、老人、女性,还是专业人士等等;(2)软件的基本设计原则,以人为本、模块分离、层次清晰、简约至上、适用为先、抽象基本业务等等;(3)软件编写模式,比如装饰模式、责任链、单件模式等等。

从某种意义上说,设计思想构成了软件的主题。

软件原则是我们在开发中的必须遵循的准绳。

软件编写模式是开发过程中的重要经验总结。

灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护。

stl面试题

stl面试题

stl面试题1. 什么是STL?STL(Standard Template Library)是C++标准库的一部分,提供了一系列的数据结构和算法,以便开发者更加方便地进行软件开发。

STL 的设计目标是提供通用的、高效的、易用的模板类和函数,以支持各类常见的编程任务。

2. STL的基本组成部分STL主要由以下三个组件构成:a) 容器(Containers):用于存储各种类型的数据,如vector、list、deque、set、map等。

b) 算法(Algorithms):提供了一系列的算法,比如排序、查找、合并等操作,可以用于容器中的数据。

c) 迭代器(Iterators):充当容器和算法之间的桥梁,用于遍历容器中的元素。

3. STL常用容器及其特点STL提供了多种容器,每种容器都有各自的特点和适用场景。

以下是一些常用容器及其特点:a) vector:动态数组,支持快速随机访问,但在插入和删除元素时效率较低。

b) list:双向链表,支持快速插入和删除元素,但随机访问效率较低。

c) deque:双端队列,支持在两端进行快速插入和删除操作。

d) set:有序集合,内部元素自动排序,不允许重复元素。

e) map:有序键值对集合,内部元素按键排序,并且每个键只能对应一个值。

4. STL常用算法及其应用STL提供了丰富的算法,可以在各种容器上进行操作,以下是一些常用算法及其应用场景:a) find:在容器中查找指定元素,用于快速查找数据。

b) sort:对容器中的元素进行排序,用于按照一定规则重新排列数据。

c) merge:将两个有序容器合并为一个有序容器,用于合并多个有序数据集。

d) unique:移除容器中的重复元素,用于去重操作。

e) count:统计容器中指定元素出现的次数,用于计数操作。

5. STL迭代器的使用STL迭代器是一种模板类,用于遍历容器中的元素。

迭代器提供了类似指针的操作接口,可以通过解引用操作符来访问元素,使用自增运算符进行遍历。

C#非代码题重点

C#非代码题重点

练习题1选择题(9)CLR为.NET提供以下方面的功能或者服务,除了。

DA.无用存储单元收集B.代码验证和类型安全C.代码访问安全D.自动消除程序中的逻辑错误(10).NET Framework有两个主要组件,分别是和.NET基础类库。

AA.公共语言运行环境B.Web服务C.命名空间D. Main()函数(11)控制台应用程序使用命名空间中的类处理输入和输出。

AA.System.IOB.System.WebC.System.Windows.FormsD.System.Data问答题(1)简述C#语言的基本特点。

答:①简洁的语法②完全面对对象③与Web紧密结合④充分的安全性和错误处理⑤灵活性⑥兼容性⑦简化程序的生成过程(4)托管代码和非托管代码有什么区别?答:托管代码是指为.NET Framework编写的代码,它在.NET Framework的公共语言运行库(CLR)控制之下运行,类似于Java的虚拟机机制。

托管代码应用程序可以获得CLR 服务,例如自动垃圾回收、类型检查和安全支持等。

非托管代码是指不在CLR控制之下运行的代码,如Win32 C/C++ DLL。

非托管代码有操作系统直接运行,因此必须提供自己的垃圾回收、类型检查、安全支持等服务。

最简单的一个差别是,托管代码不能直接写内存,是安全的,而非托管代码是非安全代码,可以使用指针操作内存。

练习题2选择题(2)C#的数据类型分为。

BA.值类型和调用类型B.值类型和引用类型C.引用类型和关系类型D.关系类型和调用类型(5)是将值类型转换成引用类型。

AA.装箱B.拆箱C.赋值D.实例化(6)是将引用类型转换成值类型。

BA.装箱B.拆箱C.赋值D.实例化问答题(1)简述C#中有哪些数据类型。

答:C#数据结构主要分为值类型和引用类型,其中,还分为许多小类,详情见下图。

练习题3选择题(1)if语句后面的表达式应该是。

BA.字符串表达式B.条件表达式C.算术表达式D.任意表达式(6)以下叙述正确的是。

c语言实现迭代器iterator

c语言实现迭代器iterator

c语⾔实现迭代器iterator 1. iterator.h1 #ifndef _ITERATOR_H2#define _ITERATOR_H34 typedef void *iterator_t;5 typedef void (*iterator_next_t)(iterator_t *p_iter);6 typedef void (*iterator_prev_t)(iterator_t *p_iter);7 typedef int (*compare_t)(iterator_t it1, iterator_t it2);8 typedef void (*swap_t)(iterator_t it1, iterator_t it2);9 typedef int (*visit_t)(void *p_arg, iterator_t it);1011 typedef struct _iterator_if{12 iterator_next_t pfn_next; //调⽤迭代器后移的函数指针,相当于p1++13 iterator_prev_t pfn_prev; //调⽤迭代器前移的函数指针,相当于p2--14 }iterator_if_t;1516void iterator_if_init(iterator_if_t *p_if, iterator_next_t pfn_next, iterator_prev_t pfn_prev);17void iterator_next(iterator_if_t *p_if, iterator_t *p_iter); //迭代器后移函数,相当于++18void iterator_prev(iterator_if_t *p_if, iterator_t *p_iter); //迭代器前移函数,相当于--19//void iterator_if_get(iterator_if_t *p_if);20void iter_sort(iterator_if_t *p_if, iterator_t begin, iterator_t end, compare_t compare, swap_t swap);21void iter_foreach(iterator_if_t *p_if, iterator_t begin, iterator_t end, visit_t visit, void *p_arg);22#endif2. iterator.c1 #include "iterator.h"23void iterator_if_init(iterator_if_t *p_if, iterator_next_t pfn_next, iterator_prev_t pfn_prev)4 {5 p_if->pfn_next = pfn_next;6 p_if->pfn_prev = pfn_prev;7 }89void iterator_next(iterator_if_t *p_if, iterator_t *p_iter)10 {11 p_if->pfn_next(p_iter);12 }1314void iterator_prev(iterator_if_t *p_if, iterator_t *p_iter)15 {16 p_if->pfn_prev(p_iter);17 }1819/**20 * @breif 冒泡排序算法函数21*/22void iter_sort(iterator_if_t *p_if, iterator_t begin, iterator_t end, compare_t compare, swap_t swap)23 {24int flag = 1; // flag = 1,表⽰指针的内容未交换25 iterator_t it1 = begin; // it1指向需要排序的⾸元素26 iterator_t it2 = end; // it2指向需要排序的最后⼀个元素之后2728 iterator_t it_next;29if (begin == end)30 {31return;32 }3334while (it2 != begin)35 {36 it1 = begin;37 flag = 1;38while(it1 != it2)39 {40 it_next = it1; //暂存41 iterator_next(p_if, &it_next); // it_next为it1的下⼀个元素42if(it_next == it2) break;43if(compare(it1, it_next) > 0)44 {45 swap(it1, it_next); //交换内容46 flag = 0; // flag = 0,表⽰指针的内容已交换47 }48 it1 = it_next; // it1的下⼀个元素49 }50if(flag) return; //没有交换,表⽰已经有序,则直接返回51 iterator_prev(p_if, &it2); // it2向前移53 }5455void iter_foreach(iterator_if_t *p_if, iterator_t begin, iterator_t end, visit_t visit, void *p_arg)56 {57 iterator_t it = begin;58while(it != end)59 {60if (visit(p_arg, it) < 0)61 { //若返回值为负值,表⽰⽤户终⽌了遍历62return;63 }64 iterator_next(p_if, &it);//让迭代器向后移动65 }66 }3. demo1 #include <stdio.h>2 #include "dlist.h"3 #include "iterator.h"45#define ITERATOR_FOREATCH_EN 167 typedef struct _dlist_int8 {9 dlist_node_t node;10int data;11 }dlist_int_t;1213static void __dlist_iterator_next(iterator_t *p_iter) //让迭代器指向容器的下⼀个数据14 {15 *p_iter = ((dlist_node_t *)*p_iter)->p_next;16 }1718static void __dlist_iterator_prev(iterator_t *p_iter) //让迭代器指向容器的上⼀个数据19 {20 *p_iter = ((dlist_node_t *)*p_iter)->p_prev;21 }2223int list_node_process(void *p_arg, dlist_node_t *p_node)24 {25 printf("%d ", ((dlist_int_t *)p_node) -> data);26return0;27 }2829static int __visit(void *p_arg, iterator_t it)30 {31 printf("%d ", ((dlist_int_t *)it)->data);32return0;33 }3435static int __compare(iterator_t it1, iterator_t it2)36 {37return ((dlist_int_t *)it1) -> data - ((dlist_int_t *)it2) -> data;38 }3940static void __swap(iterator_t it1, iterator_t it2)41 {42int data = ((dlist_int_t *)it2) -> data;43 ((dlist_int_t *)it2) -> data = ((dlist_int_t *)it1) -> data;44 ((dlist_int_t *)it1) -> data = data;45 }4647int main(void)48 {49 iterator_if_t iterator_if;50 dlist_head_t head; //定义链表头结点51 dlist_int_t node[5]; //定义5个结点空间52int i;5354 dlist_init(&head);5556for (i = 0; i < 5; i++)57 { //将5个结点添加⾄链表尾部58 node[i].data = 5 - i; // 使值的顺序为 5~159 dlist_add_tail(&head, &(node[i].node));60 }61 iterator_if_init(&iterator_if, __dlist_iterator_next, __dlist_iterator_prev);6263 printf("\nBefore bubble sort:\n");64#if (ITERATOR_FOREATCH_EN)65 iter_foreach(&iterator_if,dlist_begin_get(&head), dlist_end_get(&head), __visit, NULL);67 dlist_foreach(&head, list_node_process, NULL); //打印排序前的情况68#endif6970 iter_sort(&iterator_if, dlist_begin_get(&head), dlist_end_get(&head), __compare, __swap); 7172 printf("\nAfter bubble sort:\n");7374#if (ITERATOR_FOREATCH_EN)75 iter_foreach(&iterator_if,dlist_begin_get(&head), dlist_end_get(&head), __visit, NULL); 76#else77 dlist_foreach (&head, list_node_process, NULL); //打印排序后的情况78#endif7980return0;81 }。

iterator在c语言的用法

iterator在c语言的用法

iterator在c语言的用法在C语言中,iterator是一个非常重要的概念,它可以帮助我们更方便地处理数组、列表等数据结构中的元素。

通过iterator,我们可以遍历数据结构中的所有元素,而不需要手动编写循环语句。

在本篇文章中,我们将介绍iterator在C语言中的用法。

一、定义iterator在C语言中,iterator通常是一个结构体类型,它包含两个成员:一个是用来存储当前元素的变量,另一个是指向下一个元素的指针。

常见的iterator定义方式如下:```ctypedefstruct{ElementTypecurrent;ElementType*next;}Iterator;```其中,`ElementType`是数据结构中的元素类型,`current`用于存储当前元素的值,`next`指向下一个元素。

二、使用iterator使用iterator时,我们需要先创建iterator对象,并将其初始化为指向数据结构中的第一个元素。

然后,我们可以使用迭代器对象遍历数据结构中的所有元素。

以下是一个简单的示例:```c#include<stdio.h>#include<stdlib.h>typedefstruct{intdata[100];}MyArray;IteratorcreateIterator(MyArray*array){Iteratoriter={array->data[0],&array->data[1];};returniter;}voidprintArrayElements(MyArray*array,Iteratoriter){for(;iter.current!=-1;iter.next){printf("%d",array->data[iter.current]);iter.current=iter.next;}}intmain(){MyArrayarray={{1,2,3,4,5}};Iteratoriter=createIterator(&array);printArrayElements(&array,iter);return0;}```在上面的示例中,我们首先定义了一个`MyArray`结构体类型,它包含一个大小为100的整数数组。

数据分析及应用习题库(附答案)

数据分析及应用习题库(附答案)

数据分析及应用习题库(附答案)一、单选题(共40题,每题1分,共40分)1、Python语言属于()。

A、A机器语言B、B汇编语言C、C高级语言D、D科学计算语言正确答案:C2、以下代码执行的输出结果为:()importnumpyasnparr=np.array([1,3,5,7])print(arr[2]+arr[3])A、A8B、B12C、C5D、D13正确答案:B3、对于j=10,foriinrange(j)循环内执行语句j-=1,那么该循环将执行(?)次。

A、A10B、B7C、C6D、D程序报错正确答案:A4、Thecorrectsyntaxtoaddthe1abe1s〃〃x〃〃,"V"、and""∕'"toaPandasSeries:()importpandasaspdA、Apd.DataFrame([12,z,,z13zr,,z14zz],index=["x","y","z"])"B、Bpd.1ist([12/z,'13z,,,z1Γ],index=[〃x〃,〃y〃,〃z〃])〃C、Cpd.Series([12,z∕,13,,,,z14,z],index=[〃x〃,〃y〃,〃z〃])〃D、Ddf=Pd.Series([12”,〃13〃,〃14〃],diet=[〃x〃,〃y〃,〃z〃])〃正确答案:C5、将一颗骰子投掷两次,依次记录点数,两数之差绝对值为1的概率()A、A0.1B0.2C、C0.3D、D0.4正确答案:A6、网络报文记录及分析装置告警信息可以按照多种方式进行分类,其中不包含下列哪种方式()A、Λ网络B、BIEDC、C时间段D、D模型正确答案:D7、假设有命令(P)importnumpyasnpbArraynp.array([[1,2,3],[4,5,6]])则,bΛrray.ndim的结果是A、A逻辑覆盖法B、B等价类划分C、C边界值分析D、D功能图法正确答案:A8、随机变量X、Y的协方差,记为COV(X,Y)=(?)oA、AE((X-E(X))(Y-E(Y)))B、BE(XY-E(X)E(Y))C、CE(((D(X)D(Y))71∕2))D、DE正确答案:A9^用importmatp1ot1ib.pyp1otaspt引入pyp1ot模块后,下面可以对执行的代码是()A^Apit.p1ot([1,2,3])BsBpt.p1ot([1,2,3])C>Cpit.p1ot[1,2,3]D>Dpt.p1ot[1,2,3]正确答案:B10>用importmatp1ot1ib.pyp1otaspt引入pyp1ot模块后,下面可以对执行的代码是()A、A按位取反B、B按位异或C、C按位与D、D左移一个字节正确答案:A11A importpandasaspds=pd.Series([1,2,3],index=[2,3,1])s[2]上述代码输出结果是多少?A、A数据库设计B、B软件测试C、C软件设计D、D可行性研究正确答案:D12、fractions模块中FraCtiOn类用于构造(?)类型数据。

C_C++术语中英文对照

C_C++术语中英文对照
bit 位元 位
bitwise 以 bit 为单元┅、位元逐一┅ ?
bitwise copy 以 bit 为单元进行复制、位元逐一复制 位拷贝
derived class 衍生类别 派生类
destructor(dtor) 解构式 析构函数、析构器
device 装置 设备
component 组件 组件
concrete 具象的 实在的
container 容器 容器
(存放资料的某种结构如 list, vector...)
context 背景关系、周遭环境、上下脉络 环境、上下文
const 常数(constant 的缩写,C++ 关键字)
base class 基础类别 基类
best viable function 最佳可行函式 最佳可行函式
(从 viable functions 中挑出的最佳吻合者)
call 呼叫、叫用 调用
call operator call(函式呼叫)运算子 () 调用运算符
(同 function call operator)
class body 类别本体 类体 ?
class declaration 类别宣告、类别宣告式 类声明
class definition 类别定义、类别定义式 类定义
command line 命令行 命令行
(系统文字模式提示号之後所下的整行命令)
compiler 编译器 编译器
class derivation list 类别衍化列 类继承列表
class head 类别表头 类头 ?
class hierarchy 类别继承体系 ?
access function 存取函式 存取函数

C语言中的迭代与迭代器

C语言中的迭代与迭代器

C语言中的迭代与迭代器迭代(Iteration)是程序中常用的一种控制流程方式,它让程序能够重复执行一段代码块,从而达到对一组数据或集合进行处理的目的。

在C语言中,迭代常常与循环语句结合使用,例如for循环和while循环。

迭代器(Iterator)则是一种辅助工具,它提供了对数据集合中元素进行遍历和访问的方法。

C语言中的迭代主要通过循环语句来实现。

常见的循环语句有for循环、while循环和do-while循环。

它们都允许程序重复执行一段代码块,直到满足某个终止条件。

首先,我们来看看for循环。

for循环由一个初始化表达式、一个循环条件表达式和一个迭代表达式组成。

其中,初始化表达式在循环开始前执行一次,循环条件表达式在每次迭代前进行判断,如果为真则执行循环体,执行完循环体后再执行迭代表达式。

下面是for循环的一般形式:```cfor (初始化表达式; 循环条件表达式; 迭代表达式) {// 循环体}```接下来是while循环和do-while循环。

while循环只有一个循环条件表达式,它在每次迭代前进行判断,如果为真则执行循环体。

而do-while循环则是先执行一次循环体,然后再进行循环条件的判断,如果为真则继续执行循环体,否则循环结束。

下面是它们的一般形式:```cwhile (循环条件表达式) {// 循环体}do {// 循环体} while (循环条件表达式);```这些循环语句可以让我们在程序中重复执行一段代码块,实现对数据的迭代处理。

但是有时我们可能需要更灵活、更高级的迭代方式,这就引入了迭代器的概念。

迭代器是一种抽象的数据类型,它提供了一组接口,用于遍历和访问数据集合中的元素。

在C语言中,我们可以利用指针来实现迭代器的功能。

通过定义一个指针,我们可以按照一定的规则遍历数组或其他数据结构中的元素。

以数组为例,我们可以通过指针来遍历数组中的元素。

假设有一个整型数组arr,我们可以定义一个指针p指向数组的第一个元素,并通过不断移动指针的位置来遍历整个数组。

黑马程序员C语言教程:常见的六种设计模式

黑马程序员C语言教程:常见的六种设计模式

常见的六种设计模式以及应用场景设计模式是对设计原则的具体化。

用江湖话说就是武林秘籍,总结出来的一些固定套路,可以帮助有根基的程序员迅速打通任督二脉,从此做什么都特别快。

常用的模式及其场景如下。

1) 单例模式。

单例模式是一种常用的软件设计模式。

在它的核心结构中只包含一个被称为单例类的特殊类。

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

2) 工厂模式。

工厂模式主要是为创建对象提供了接口。

应用场景如下:a. 在编码时不能预见需要创建哪种类的实例。

b. 系统不应依赖于产品类实例如何被创建、组合和表达的细节。

3) 策略模式。

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。

此模式让算法的变化独立于使用算法的客户。

应用场景如下。

a. 一件事情,有很多方案可以实现。

b. 我可以在任何时候,决定采用哪一种实现。

c. 未来可能增加更多的方案。

d. 策略模式让方案的变化不会影响到使用方案的客户。

举例业务场景如下。

系统的操作都要有日志记录,通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面。

日志写到数据库与文件中是两种算法,但调用方不关心,只负责写就是。

4) 观察者模式。

观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

应用场景如下:a.对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。

b.对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

5) 迭代器模式。

应用场景如下:当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。

其实stl容器就是很好的迭代器模式的例子。

C++面试常见100题

C++面试常见100题

C++面试常见100题1. 什么是C ++?它的优点是什么?2. C++和C的主要区别是什么?3. C++的基本语法、数据类型和控制结构?4. 定义和使用指针。

5. 定义和使用引用。

6. 什么是类?类的组成成分是什么?7. 什么是继承?派生类可以访问基类的哪些成员?8. 什么是多态?虚函数的作用?9. 什么是纯虚函数?10. 什么是数据封装?为什么需要数据封装?11. 什么是构造函数和析构函数?它们的作用是什么?12. 什么是拷贝构造函数和拷贝赋值运算符?它们的作用是什么?13. C++中的运算符重载和函数重载有什么区别?14. 什么是友元函数和友元类?15. 什么是异常处理?C++中的异常处理机制是什么?16. 什么是RAII?17. 什么是模板类和模板函数?18. STL中的容器、算法和迭代器有哪些?19. 什么是智能指针?20. 什么是虚拟函数?为什么需要虚拟函数?21. 什么是纯虚函数?为什么需要纯虚函数?22. 什么是多重继承?23. 什么是模板特化?24. C++中的多线程有哪些特点?25. Linux下如何使用多线程?26. 什么是死锁?如何避免死锁?27. 什么是进程和线程?它们的区别是什么?28. 什么是信号和信号处理?29. 什么是文件操作?C++中的文件操作函数有哪些?30. 什么是网络编程?C++中的网络编程函数有哪些?31. 什么是数据库操作?C++中的数据库操作函数有哪些?32. 什么是多态?如何实现多态?33. C++中有哪些常用的设计模式?34. 如何进行性能优化?35. C++11和C++14中的新特性有哪些?36. const关键字的作用是什么?37. static关键字的作用是什么?38. inline关键字的作用是什么?39. sizeof运算符的作用是什么?40. C++中的数据类型有哪些?它们的区别是什么?41. 什么是指针和引用?42. 什么是动态内存分配?C++中的动态内存分配函数有哪些?43. 什么是类和对象?如何定义和使用类和对象?44. 什么是构造函数和析构函数?它们的作用是什么?45. 什么是拷贝构造函数和拷贝赋值运算符?它们的作用是什么?46. C++中的运算符重载和函数重载有什么区别?47. 什么是友元函数和友元类?48. 什么是异常处理?C++中的异常处理机制是什么?49. 什么是RAII?50. 什么是模板类和模板函数?51. STL中的容器、算法和迭代器有哪些?52. 什么是智能指针?53. 什么是虚拟函数?为什么需要虚拟函数?54. 什么是纯虚函数?为什么需要纯虚函数?55. 什么是多重继承?56. 什么是模板特化?57. C++中的多线程有哪些特点?58. Linux下如何使用多线程?59. 什么是死锁?如何避免死锁?60. 什么是进程和线程?它们的区别是什么?61. 什么是信号和信号处理?62. 什么是文件操作?C++中的文件操作函数有哪些?63. 什么是网络编程?C++中的网络编程函数有哪些?64. 什么是数据库操作?C++中的数据库操作函数有哪些?65. 什么是多态?如何实现多态?66. C++中有哪些常用的设计模式?67. 如何进行性能优化?68. C++11和C++14中的新特性有哪些?69. const关键字的作用是什么?70. static关键字的作用是什么?71. inline关键字的作用是什么?72. sizeof运算符的作用是什么?73. C++中的数据类型有哪些?它们的区别是什么?74. 什么是指针和引用?75. 什么是动态内存分配?C++中的动态内存分配函数有哪些?76. 什么是类和对象?如何定义和使用类和对象?77. 什么是构造函数和析构函数?它们的作用是什么?78. 什么是拷贝构造函数和拷贝赋值运算符?它们的作用是什么?79. C++中的运算符重载和函数重载有什么区别?80. 什么是友元函数和友元类?81. 什么是异常处理?C++中的异常处理机制是什么?82. 什么是RAII?83. 什么是模板类和模板函数?84. STL中的容器、算法和迭代器有哪些?85. 什么是智能指针?86. 什么是虚拟函数?为什么需要虚拟函数?87. 什么是纯虚函数?为什么需要纯虚函数?88. 什么是多重继承?89. 什么是模板特化?90. C++中的多线程有哪些特点?91. Linux下如何使用多线程?92. 什么是死锁?如何避免死锁?93. 什么是进程和线程?它们的区别是什么?94. 什么是信号和信号处理?95. 什么是文件操作?C++中的文件操作函数有哪些?96. 什么是网络编程?C++中的网络编程函数有哪些?97. 什么是数据库操作?C++中的数据库操作函数有哪些?98. 什么是多态?如何实现多态?99. C++中有哪些常用的设计模式?100. 如何进行性能优化?。

c++迭代器原理

c++迭代器原理

C++中的迭代器是一种用于遍历容器(如数组、链表、向量、映射等)元素的对象或指针,它们提供了一种通用的方法来访问容器中的元素,而不需要关心容器的具体类型和内部实现。

迭代器是STL(标准模板库)的关键组成部分,它们允许开发人员编写通用的、可重用的算法,适用于各种不同类型的容器。

迭代器的原理如下:1. **定义迭代器类型**:在C++中,迭代器通常作为容器类的内部类或类型别名定义。

容器类通过定义适当的迭代器类型,告诉编译器如何遍历它们的元素。

2. **迭代器操作**:迭代器可以执行以下操作:- **解引用(*)**:通过解引用操作可以访问当前迭代器指向的元素。

- **递增(++)**:递增操作使迭代器指向容器中的下一个元素。

- **递减(--)**:递减操作使迭代器指向容器中的前一个元素(不是所有容器都支持递减操作)。

3. **迭代器范围**:迭代器通常定义了一个范围,即从容器的起始位置到结束位置的范围。

通过递增迭代器,可以遍历整个范围。

4. **迭代器类型**:不同的容器类定义了不同类型的迭代器。

例如,`vector`容器有`vector<int>::iterator`类型的迭代器,而`list`容器有`list<int>::iterator`类型的迭代器。

这些迭代器类型可以用于不同容器的不同元素类型。

5. **迭代器失效**:要小心处理容器的修改,因为在容器被修改后,迭代器可能会失效。

例如,如果在使用迭代器遍历容器的同时插入或删除元素,迭代器可能会失效,导致未定义的行为。

6. **迭代器类别**:STL定义了不同类别的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。

这些类别代表了不同迭代器的功能和性能要求,例如,随机访问迭代器支持O(1)时间复杂度的随机访问,而输入迭代器只支持单向遍历。

总之,C++迭代器是一种强大的工具,使开发人员能够以通用的方式遍历和操作不同类型的容器。

c++(vector容器和几种常用的迭代器遍历方法)

c++(vector容器和几种常用的迭代器遍历方法)

c++(vector容器和⼏种常⽤的迭代器遍历⽅法)c++(vector容器和⼏种常⽤的迭代器遍历⽅法)#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <vector>#include <algorithm>#include <string>using namespace std;//迭代器遍历功能⽤指针理解//普通指针也算是⼀种迭代器template<class T>void printFun(T &arr,int size){for (int i = 0; i < size; i++){cout << arr[i]<<" ";}cout << endl;}void test01(){int array[5] = { 1,3,5,6,8 };;printFun(array,5);}void myPrint(int v) {cout << v << endl;}void test02(){//声明容器vector<int> v; //声明⼀个容器这个容器中存放着int类型的数据v.push_back(10);v.push_back(11);v.push_back(12);v.push_back(13);//便利容器中的数据//利⽤迭代器/*No.1vector<int>::iterator itB = v.begin();vector<int>::iterator itE = v.end();while (itB != itE){cout << *itB<< endl;itB++;}*//*No.2for (vector<int>::iterator itB = v.begin(); itB != v.end(); itB++)cout << *itB << endl;for (auto itB = v.begin(); itB != v.end(); ++itB){cout << *itB << endl;;}*//*No.3for_each(v.begin(), v.end(), myPrint);void myPrint(int v) {cout << v << endl;}*/}class Person{public:Person(string name,int age):m_name(name),m_age(age){}string m_name;int m_age;};void test03(){vector<Person> v1;Person p1("⽼王", 10);Person p2("⽼李", 11);Person p3("⽼刘", 12);Person p4("⽼赵", 13);Person p5("⽼猴", 14);v1.push_back(p1);v1.push_back(p2);v1.push_back(p3);v1.push_back(p4);v1.push_back(p5);for (vector<Person>::iterator itB = v1.begin(); itB != v1.end(); ++itB){cout << "姓名: " << (*itB).m_name << " 年龄: " << itB->m_age << endl; }}void test04(){vector<Person *> v1;Person p1("⽼王", 10);Person p2("⽼李", 11);Person p3("⽼刘", 12);Person p4("⽼赵", 13);Person p5("⽼猴", 14);v1.push_back(&p1);v1.push_back(&p2);v1.push_back(&p3);v1.push_back(&p4);v1.push_back(&p5);for (auto &a : v1){cout << a->m_name << " " << a->m_age << endl;}/*for (auto itB = v1.begin(); itB != v1.end(); ++itB){cout << (*itB)->m_name << " " << (*itB)->m_age << endl;}*//*for (vector<Person *>::iterator itB = v1.begin(); itB != v1.end(); itB++) {cout << (*itB)->m_name << " age " << (*itB)->m_age << endl;}*/}。

南开大学《Python编程基础》在线作业01

南开大学《Python编程基础》在线作业01

《Python编程基础》在线作业已知“a=list((1,2))+list((2,3))”,则a的值是( )。

A:[1,2,3]B:[1,2,2,3]C:(1,2,3)D:(1,2,2,3)参考选项:B已知“str='Python#C++##Python'”,则“str.rfind('Python')”返回的结果是( )。

A:0B:12C:-1D:报错参考选项:B与正则表达式“^ab[a-z]?c”匹配的字符串是( )。

A:abdecB:abcC:ab0cD:cabc参考选项:B已知m是一个Match对象,则m.group(1)返回的结果必然是一个( )。

A:字符串B:元组C:列表D:不确定参考选项:A定义函数时函数名后面的一对小括号中给出的参数称为( )。

A:实参B:形参C:类型参数D:名字参数参考选项:B已知“a=[1,2,3]”且“b=a[:]”,则执行“a[1]=10”后,b的值为( )。

A:[10,2,3]B:[1,10,3]C:[1,2,10]D:[1,2,3]参考选项:D用于跳出循环的命令是( )。

A:breakB:continueC:elseD:pass参考选项:A已知“str='Python#C++##Python'”,则“str.find('Python')”返回的结果是( )。

A:0B:12C:-1D:报错参考选项:A7^10的运算结果为( )。

A:17B:15C:13D:2参考选项:C已知“a=tuple([1,2])+tuple([2,3])”,则a的值是( )。

A:[1,2,3]B:[1,2,2,3]C:(1,2,3)D:(1,2,2,3)参考选项:D在绘制流程图时,条件判断应放在( )中。

A:圆角矩形B:圆C:矩形框D:菱形框参考选项:D下面程序的输出结果是( )。

def StudentInfo(name,country='中国'):print('%s,%s'%(name,country))StudentInfo('大卫','美国')A:大卫,美国。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

什么是C++的迭代器Interator?
容器就是数据结构的泛指,迭代器就是指针的泛指,可以指向元素。

容器相当于一个储藏柜,里面装的许多不同的物品就像是储存的元素,比如面包、啤酒、苹果、现金。

要取得各个物体就得用与各个物体向匹配的工具,如取出面包要用盘子、取出啤酒要用杯子、取出苹果要用篮子、取出现金要用钱包。

迭代器的作用就相当于取出物品的工具的抽象,通过迭代器泛指现实生活中从贮藏室中取出物体的工具。

C++迭代器是一种检查容器内元素并遍历元素的数据类型。

1 Iterator definitions
In C++, an iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators (at least, the increment (++) and dereference (*) operators).
The most obvious form of iterator is a pointer: A pointer can point to elements in an array, and can iterate through them using the increment operator (++). But other forms of iterators exist. For example, each container type (such as a vector) has a specific iterator type designed to iterate through its elements in an efficient way.
C++迭代器Interator就是一个指向某种STL对象的指针。

通过该指针可以简单方便地遍历所有元素。

C++中的iterator为STL中的重要概念。

iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。

对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。

除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素,方法有ID,关键字等等。

为了统一所有的容器的这种工具的使用,一般提供一整套容器的开发者就会用一种方式来表示各种容器的访问工具。

例如C++STL就是使用iterator。

MFC自己的容器使用position。

C#和java也有自己的方法,但方法是不变的。

iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。

例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent = m_pCurrent-> pNext;的操作。

因此每种容器都有自己的iterator实现方法。

C++ STL iterator的常用方法有:
iterator++ 移到下个元素
iterator-- 移到上个元素
*iterator 访问iterator所指元素的值
<> == != iterator之间的比较,例如判断哪个元素在前
iterator1 + iterator2 iterator之间的加法运算,类似于指针加法
2 容器的iterator 类型
每种容器类型都定义了自己的C++迭代器类型,如vector:vector<int>::iterator iter;这符语句定义了一个名为iter 的变量,它的数据类型是vector<int>定义的iterator 类型。

每个标准库容器类型都定义了一个名为iterator 的成员,这里的iterator 与迭代器实际类型的含义相同。

begin 和end 操作每种容器都定义了一对命名为begin 和end 的函数,用于返回迭代器。

如果容器中有元素的话,由begin 返回的迭代器指向第一个元素:
vector<int>::iterator iter = ivec.begin();
上述语句把iter 初始化为由名为vector 操作返回的值。

假设vector 不空,初始化后,iter 即指该元素为ivec[0]。

由end 操作返回的C++迭代器指向vector 的“末端元素的下一个”。

“超出末端迭代器”(off-the-end iterator)。

表明它指向了一个不存在的元素。

如果vector 为空,begin 返回的迭代器与end 返回的迭代器相同。

由end 操作返回的迭代器并不指向vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector 中所有元素。

a)使用迭代器读取vector中的每一个元素
vector<int> ivec(10,1);
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
*iter=2; //使用* 访问迭代器所指向的元素
}
b)const_iterator只能读取容器中的元素,而不能修改
for(vector<int>::const_iterator citer=ivec.begin();citer!=ivec.end();citer++) {
cout<<*citer;
//*citer=3; error
}
3 vector 迭代器的自增和解引用运算
C++迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。

迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:
*iter = 0;
解引用操作符返回迭代器当前所指向的元素。

假设iter 指向vector 对象ivec 的第一元素,那么*iter 和ivec[0] 就是指向同一个元素。

上面这个语句的效果就是把这个元素的值赋为0。

迭代器使用自增操作符向前移动迭代器指向容器中下一个元素。

从逻辑上说,C++迭代器的自增操作和int 型对象的自增操作类似。

对int 对象来说,操作结果就是把int 型值“加1”,而对迭代器对象则是把容器中的迭代器“向前移动一个位置”。

因此,如果iter 指向第一个元素,则++iter 指向第二个元素。

由于end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。

4示例程序:
a)例1,VS2010中的控台程序要Ctrl + F5 才能看到。

#include <iostream>
#include <vector>
using namespace std;int main()
{
//定义并赋值输出
vector<int> ivec;
cout<<"Befort *2 the elements are:"<<endl;
for(vector<int>::size_type ix=0;
ix!=10;++ix){ ivec.push_back(ix);
cout<<ivec[ix]<<'\t';
}
//把每个值乘以2并输出
cout<<endl<<"After *2 the elements are:"<<endl;
for(vector<int>::iterator iter=ivec.begin();
iter!=ivec.end();++iter)
{
*iter*=2; cout<<*iter<<'\t';
}
return 0;
}
b)例2
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> ivec;
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(3);
ivec.push_back(4);
for(vector<int>::iterator iter = ivec.begin();iter != ivec.end(); ++iter) cout << *iter << endl;
return 0;
}。

相关文档
最新文档