龙空技术网

STL|一个实例阐述迭代器无缝连接STL容器和STL算法

小智雅汇 107

前言:

目前兄弟们对“迭代器遍历vector”大致比较关注,同学们都想要剖析一些“迭代器遍历vector”的相关文章。那么小编也在网摘上搜集了一些有关“迭代器遍历vector””的相关资讯,希望各位老铁们能喜欢,小伙伴们快快来了解一下吧!

简单地说,标准模板库(STL)是一组模板类和模板函数,向程序员提供了:

用于存储信息的容器;

用于访问容器存储信息的迭代器;

用于操作容器内容的算法;

豪无疑问,容器也是一种数据结构,包含数据的逻辑结构和存储结构的实现、以及数据结构的算法(容器构造和元素的增、查、删、改)。容器的底层数据结构可以是普通数组、链表、二叉树。底层数据结构与数据元素操作(数据结构算法)的组合形成了不同的容器,它们在数据元素的访问、增、增、查、删、改等诸多方面各有优、劣势。

顺序容器最经常使用的容器类型是 vector,它支持对元素的快速随机访问。可高效地在 vector 容器尾部添加和删除元素,而在其他任何位置上的插入或删除运算则要付出比较昂贵的代价。deque 类与 vector 相似,但它还支持在 deque 首部的快速插入和删除运算。list 类只支持元素的顺序访问,但在 list 内部任何位置插入和删除元素都非常快速。

关联容器一般使用二叉树作为底层数据结构,以键(key)来映射数值存储地址,所以在数据的查询速度方面具有优势。

容器定义的操作非常少,只定义了构造函数、添加或删除元素的操作、设置容器长度的操作以及返回指向特殊元素的迭代器的操作。其他一些有用的操作,如排序、查找,则不是由容器类型定义,而是由标准算法定义。

在数据类型内部,我们强调数据和操作的融合,在数据类型外部,我们强调数据和操作的分离,也就是泛型的概念,一个函数、一个算法、一个类类型应该独立于具体的数据类型而且有通用性,由编译器辅助完成在实例化的工作。

查找、排序、反转等都是标准的编程需求,不应让程序员重复实现这样的功能。因此STL以STL算法的方式提供这些函数,通过结合使用这些函数和迭代器,程序员可对容器执行一些最常见的操作。

为实现泛型算法对泛型容器的操作,使用迭代器做为媒介,泛型算法操作容器的迭代器来间接操作容器。

STL中的迭代器是模板类,从某种程序上说,它们是泛型指针。这些模板类让程序员能够对STL容器进行操作。注意,操作也可以是以模板函数的方式提供的STL算法,迭代器是一座桥梁,让这些模板函数能够以一致而无缝的方式处理容器。

最简单的迭代器是指针。给定一个指向数组中的第一个元素的指针,可递增该指针使其指向下一个元素,还可直接对当前位置的元素进行操作。

输入迭代器是通过对输入迭代器解除引用,它将引用对象,而对象可能位于集合中。最严格的输入迭代器确保只能以只读的方式访问对象。

迭代器的分类:输入、输出、前向、双向、随机访问五种,是只读、只写、递增操作、递减操作、加减偏移量操作的5个功能的叠加组合。

下面通过一个实例来阐述迭代器是如何无缝连接STL容器和STL算法的。

代码输出:

The contents of the vector are:

50

2991

23

9999

Value 2991 found in the vector at position: 1

上述代码演示了如何使用迭代器遍历vector向量。迭代器是一个接口,将算法(find)连接到其要操作的数据所属的容器(如vector)。

第20行的代码:

vector <int>::iterator arrIterator = intArray.begin ();

声明了迭代器对象 arrIterator,并将其初始化为指向容器开头,即vector的成员函数begin()返回的值。

第22-29行代码演示了如何在循环中使用该迭代器遍历并显示vector包含的元素,这与显示静态数组的内容极其相似。

迭代器的用法在所有STL容器中都相同。所有容器都提供了begin()成员函数和end成员函数,其中前者指向第一个元素,后者指向容器中最后一个元素的后面(起一个哨兵(sentinel)的作用,表示我们已处理完容器中所有元素)。

第32行代码:

vector <int>::iterator elFound = find (intArray.begin () ,intArray.end (), 2991);

算法函数find操作的结果也是返回一个迭代器。

如果将上述程序清单中的容器vector都替换成容器deque,代码仍然能通过编译并完美运行,这也充分表明了迭代器可以让算法和容器彼此独立,迭代器对各容器操作的一致性,以及迭代器对STL容器和STL算法是如何真正无缝连接的。

附代码:

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int main ()

{

// A dynamic array of integers

vector <int> intArray;

// Insert sample integers into the array

intArray.push_back (50);

intArray.push_back (2991);

intArray.push_back (23);

intArray.push_back (9999);

cout << "The contents of the vector are: " << endl;

// Walk the vector and read values using an iterator

vector <int>::iterator arrIterator = intArray.begin ();

while (arrIterator != intArray.end ())

{

// Write the value to the screen

cout << *arrIterator << endl;

// Increment the iterator to access the next element

++ arrIterator;

}

// Find an element (say 2991) in the array using the 'find' algorithm...

vector <int>::iterator elFound = find (intArray.begin ()

,intArray.end (), 2991);

// Check if value was found

if (elFound != intArray.end ())

{

// Value was found... Determine position in the array:

int elPos = distance (intArray.begin (), elFound);

cout << "Value "<< *elFound;

cout << " found in the vector at position: " << elPos << endl;

}

system("pause");

return 0;

}

标签: #迭代器遍历vector