C++ STL 容器 迭代器 算法 [大三四八九月实习]

来源:互联网 发布:简单校园网络规划设计 编辑:程序博客网 时间:2024/05/21 09:29

0 关于计算机语言中的命名

在计算机语言中,一个对象不管它被取为什么名字,只要知道它是用来干什么的即可。不必太纠结于它的名字,它没有行不改名坐不改姓的江湖气息,自己如果觉得有一个更适合的名字可以在自己私人空间里给它再取一个小名供自己使用。但是一般来说,它之所以会被取为这个名字是有道理且合适的,只不过对于新手来说这些名字听起来过于“高级”就形成陌生感,咱可以从它的用途出发,为自己的理解再为其命一次名。

 

1 容器(container)

(1)概念

在生活中,容器从玻璃容器、布料容器等可以具体化到生活中具体的存储物体。当我们需要喝水时可能就需要“水杯”这个容器来容水;当我们马上要去逛街时可能需要“钱包”这个容器来存储钱。在生活中,容器不具体指明它就是“水杯”、“钱包”,但它在具体需要的时候容器就可以具体的指“水杯”、“钱包”及其它的容器对象。

C++中,容器从vector容器[ vector只是一个似乎符合它的名字而已]map容器容器可以具体化到容纳C++具体的内建数据类型或者自定class类型。当C++需要用一片连续内存存储整型数据时我们可能需要vector<int>[ <>内的数据类型用来表示此vector对象所要存储内容的数据类型 ]容器来存储它们;当C++需要在一个节点存储两个数据类型分别为stringint时且每个节点以关联方式存储时我们可能需要map<string, int>类型容器来存储它们。C++ STL中的每一类型容器vectormap(跟生活中容器玻璃类、布料类对应)之所以能够进一步标识为C++的内建数据类型或自建Class类型,是因为STL中的容器是采用类模板方式来实现的。

 

(2)构造容器

容器的构造形式如下:

container<type1, type2>  container_object;

container表示STL中具体的容器类,如vectormap

type表示要用此容器来存储的具体数据类型,C++内建或者自定义class”<>”内能定义的数据类型个数视具体的container类而定。

container_object为具体的被声明的容器对象

 

观点1

一种容器作为一个类,它其中必定包含自己的成员函数,这些成员函数就是用来执行一些对存入数据的操作(如在某位置插入/删除元素)或作为迭代器及算法的联系点(使用这些函数成员就能够和迭代器或者算法对应起来)

首先根据当前需求决定要使用的数据类型,然后根据这种数据类型的特点来匹配STL中每种容器的特点,然后选择一种您觉得最佳的容器来定义容器对象。

1.如现在需要在程序中声明一组按顺序存储在一起的具有相同数据类型的数据类型,咱打算怎么做呢?

方式1:根据这个所需存储数据类型特点咱可以使用数组嘛。

如果这些数据是int那就定义一个整型数组int in_data[SIZE];如果这些所需存储的数据是……依次类推似的定义。

方式2:使用vector容器来具体的存储这类数据嘛。

如果这些数据是整型的,那就将vector具体的定义为存储整型数据的容器vector<int>  v_in_data;如果这些所需存储的数据是……依次类推似的定义。

 

2.如现在需要在程序中定义一组…….

类似1的做法……

方式1:使用对应的简单数据类型或者定义结构体来存储数据

方式2:使用容器

那么在每一种数据类型的需求下我们首先都可以通过结构体来完成对数据的存储,也可以通过C++STL中的容器来存储。那么咱们要使用哪一种呢。其实这个没什么具体的标准来规定应该使用哪一种。只是STL中已经将容器、迭代器及算法集成了一套,更加可能的为用户带来更高校的编码方式而已。所以,在C++中,推荐直接用STL容器来解决数据问题的情况要多一些,但如果您对结构体及对应的算法已经炉火纯青使用什么都是一样。

 

2 迭代器(iterator)

迭代器这个名字取的有点怪兮兮的。书中所述迭代器类似于指针用来帮助用户更加便利的遍历容器。而且迭代器也是采用类模板的思想来设计的,它可以根据具体容器的具体数据类型来定义得到此容器对应的迭代器。如vector<int>::iterator v_in_it;语句表示v_in_it为容器vector<int>对象下的迭代器。容器、迭代器及算法被成套的集在C++ STL中,它们之间定有联系点来供用户使用它们三个。

vector<int> v_in;

vector<int>::iterator v_in_it_1 =  v_in.begin();

vector<int>::iterator v_in_it_2=  v_in.end();

第一语句表示声明了一个空的vector<int>对象。第二语句v_in对象使用begin()函数返回v_in容器的首地址(第一个元素)并赋值给对应的迭代器对象v_in_it_1。第三语句是返回了v_in容器最后一个元素的地址。此后,就可以通过对迭代器对象v_in_it_1v_in_it_2的运算来访问容器对象v_in中的元素。

C/C++中,数组元素可以通过下标或者地址的形式被访问到。vector也可以通过下标的方式访问其中的元素。但是为什么要专门设计一个基于类模板的iterator来供STL容器遍历元素使用呢?

我想迭代器具有类模板的性质导致它能够适用于任意一种容器对象具有通用性是一个原因。

另外用指针来间接的遍历元素似乎已成为一种习惯与爱好(常数地址本身不可改变),每遇到数组时,我们就会定义与此数组类型匹配的指针来遍历此数组元素。

用下标访问元素和用指针访问元素内部过程的区别。

 

观点2

这就是迭代器(iterator),容器利用成员函数(begin等)将容器的某处地址返回并赋值给迭代器,然后迭代器就可以通过运算在容器元素地址之间来回穿梭,为遍历容器元素提供了地址。

 

3算法(algorithm)

忘记了说重要的一点。容器和算法之间的对应不再需要用成员函数来提供联系,因为这些对容器元素的算法(遍历、排序、索引、删除等)就存在于容器的成员函数之中。这算法只是需要容器中具体元素的下标(通过下标来访问元素),而这个下标就可以通过迭代器(iterator)来提供。

 

4容器 迭代器 算法 一个语句的关系

其实C++ STL中的这三者的关系没有想象中的那么复杂。就一个语句就能表示这三者的关系:

 

图1 容器 迭代器 算法的关系

 

只是不要忘记了这三者都是类,其中都再次包含了自己的数据成员和函数成员。这些成员是为了能够更高效的操作。

 

此次笔记记录完毕。

原创粉丝点击