C++中Standard Template Library(STL)入门简要概况

STL在C++中算是相当简洁方便的东西了,但不知为何网上的教程都非常难,给新手入门造成了非常多的困扰。在此写篇新手入门教程。阅读此文需要有一定的C/C++基础,比如你要会用C语言的数组、链表等,会用C++类并且有一定了解等等,不会的还是别看了,就算你会用STL你也会发现有各种各样的bug。

本篇只介绍STL最基础的部分,其他的调用方式等等都差不多了。本篇不会讲解太多,具体需要自己去研究进入正题

(1) vector

很神奇的一个词汇,翻译成汉语是“向量”,其实,这就是一个C++类,用于实现变长数组的功能。特性:一个vector只能存储一种数据类型,不能像VB那样屌。

#include <vector>
using namespace std;
使用vector前需要在代码前面加上上面两句,用于引入vector库。
然后定义一个可以存储int类型数据的变长数组

vector<int> v;
定义完毕之后,向数组中插入数据

v.resize(3);
v[0] = 1;
v[1] = 4;
v[2] = 3;

分配三个存储空间,然后对其进行赋值。其中resize可以省略。

C++为了效率,在resize参数小于容器总容量时,并不会释放掉多余的空间,而是do nothing。

上面体现了一个数组的特性,但还没体现动态数组吧。下面介绍数组的动态扩展。

v.push_back(2);

这句话的意思是再向数组末尾插入 2 这个数据。数组的长度为3,当长度不足时,vector将会自动扩展空间。默认长度变为原来两倍。可通过v.capacity()获取总容量,也可通过v.size()获取已储存的数据个数。

不同的编译器厂家对STL的实现有一定的区别,比如自动增长,有些编译器可能不是直接2倍,而是1.5倍之类的,比如vs某个版本就是1.25倍,使容器中有效数据始终保持在80%以上。

(2)遍历

for (std::vector<int>::iterator i = v.begin(); i != v.end(); i++) {
	cout << *i << endl;
}
上面代码就是遍历并打印数据了。可以看到打印结果为  1 4 3 2

std::vector<int>::iterator这句话有点长啊,其实意思就是 std::vector<int> (数组类型)的 iterator (索引器),专门用来索引这种数组用的。v.begin()为数组v的起始位置,也就是指向数组第一个元素 0 的指针。v.end() 为数组最后一个元素的后一位,为NULL的指针,i++表示索引器向下移动一位。

上面的迭代类型可以用auto表示,也可以decltype,也可以用基于范围的for循环:

for (int i : v) {
	cout << i << endl;
}
写法上比上面更简洁。另外在C++14中引入了静态迭代,在迭代中的迭代子是const数据,避免修改导致出错
for (std::vector<int>::const_iterator i = v.cbegin(); i != v.cend(); i++) {
	cout << *i << endl;
}

(3)简要概况

stl集合了变长数组、链表、队列、图、哈希表等等一大堆常用数据结构,且使用的最优算法。

避免低效事件,比如在数组开始地方或中间插入元素,这几乎将要移动整个数组。如果确实有需要,可以考虑使用双端队列。

[]索引为了效率不会有错误判断,如果有需要,使用at()索引。

STL还封装了常用算法,引入 #include <algorithm> 头文件,可以使用sort排序函数等函数,支持默认排序以及自定义排序

sort(v.begin(), v.end());
除了默认排序外,sort也支持自定义排序。

v.capacity()为占用空间大小,为避免过多内存切换,调用v.clear()并不会真正释放空间。只有在析构和swap时才会释放空间。push在顶部插入数据,pop弹出顶部数据,empty检查是否为空。另外对于vector这类可以通过下标访问数据的来说,下标访问并不会检查边界,用.at()会检查是否越界。

(4)stl常用容器

常用包括vector向量(动态数组)、list(双端链表)、slist(单链表)、map(哈希表)、set(有序集合红黑树)、dictionary(字典)、queue(队列)、deque(双端队列)、priority_queue(优先队列)


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页