第18章 标准模块库
目录标题
前提
C++较之C语言强大的功能之一是,C++编译器自带了大量的可复用代码库,我们称为标准模板库(STL)。标准模板库是一套常用的数据结构的集合,包括链表和一些基于二叉树的数据结构。
18.1 vector,大小可变的数组
(1)在STL中有一个称为vector的数据结构,可以用来代替数组。vector跟数组非常相似,只不过vector的大小可以自动调整,不需要编程人员关心内存分配和已存在元素的移动等细节问题。
(2)声明:
#include<vector>
using namespace std;
vector<int> a_vector(10);
首先,你需要包含**(include)头文件vector**,以便能随时使用vector数据结构。你还需要使用命名空间(namespace)std,因为vector跟cin和cout类似,都是标准库的一部分。
其次,当你声明一个vector时,必须在尖括号中标识出想要在vector中存储的数据类型。
最后,vector的大小放在圆括号中,而不是方括号。
一旦构建好了自己的vector,你便能用和访问数组的同样方式来访问vector中的每个元素了:
for(int i=0;i<10;i++)
{
a_vector[i]=0;
an_array[i]=0;
}
18.1.1 vector的方法调用
(1)vector提供了执行这些操作的函数。vector利用了C++的一个特性:叫做方法,它是一个随着变量类型(在此例中,这个变量类型为vector)一起声明的函数。调用一个方法要使用新的语法,如下:
a_vector.size(); =size(a_vector);
这段代码调用了a_vector的方法size,返回该vector的大小。这有点像访问一个结构体的域,所不同的是,你访问的表示域,而是该结构的方法。这个特殊的语法是进行这种函数调用的唯一方式。
18.1.2 vector的其他功能
(1)vector可以很容易地增加它所存储的值的数目,无需做任何烦琐的内存分配操作。例子,你若想添加更多的元素到vector中,可以这样写:
a_vector.push_back(10);
这个语句增加一个新元素到vector中。具体来说,它指的是:“添加元素10到当前vector的末尾”。vector本身会处理所有的调整大小操作。要是在数组中做这件事,你就必须分配新内存,将所有的值复制过去,最后再添加上你的新元素。当然,vector内部也要分配内存和复制元素,但它会选择一种聪明的大小分配方式,使得如果你不断地添加新元素的话,vector不会每次都重新调整内存大小。
(2)方括号只能用来处理已经分配的内存。
18.2 map
(1)map类型,允许指定键(key)和值(value)的类型。
例如:一个用来保存简单的电子邮件地址簿的数据结构。
#include<map>
#include<string>
using namespace std;
map<string,string> name_to_email;
这里,我们需要告诉map数据结构两个不同的类型:第一个类型string,指的是键的类型;第二个类型也是string,值的是值的类型,本例中指邮箱地址。
(1)STL的map有一个很大的特点是,你可以使用跟数组相同的语法,来真正的使用map。
(2)因此你可以在vector上使用clear,empty和size方法,跟在map上使用的方式一样。
18.3 迭代器
void displayMap(map<string,string> map_to_print)
{
for(map<string,string>::iterator itr=map_to_print.begin(),end=map_to_print.end();itr!=end; ++itr)
{
cout<<itr->first<<" --> " << itr->second << endl;
}
}
18.4 盘点 STL
(1)vector=数组
(2)map=二叉树
18.5 进一步学习 STL
资源:SGI网站:http://www.sgi.com/tech/stl/.
http://en.cppreference.com/w/cpp.