您的位置:首页 > 其它

九、类模板和标准模板库STL(Standard Template Library)

2017-02-26 16:03 381 查看

1. 类模板

// 使用类模板,就可以适用于不同元素类型,避免创建多个类型的类。
template <typename T>      // 类模板的声明
class Array
{
};

// 类模板的使用方法:
Array<double> arr(4);     // 创建array,初始capacity为4,可以把Array<double>合起来看成一个类名


2. 标准模板库
STL

一般支持C++的编译器都带了
STL
的支持,里面提供了大量的函数模板(通用算法)和类模板

STL的头文件一般都是不带
.h
后缀的,
eg: #include <vector>  // 不是vector.h


STL 使用命名空间 std, 因此要把此前缀去掉的话,要使用
using namespace std;


3. 标准模板库
STL
vector(一维向量)

向量是数组(连续存储)和链表(跳跃存储)的结合体

vector 设计之初即是为了改善C语言原生数组的种种缺失与不便,而欲提供一种更有效、更安全的数组。

vector 的使用接口刻意模拟C语言原生数组,较明显的差异在于存储器管理,原生数组必须在宣告数组的时候明确指定数组长度(例如 int a[5]),但是 vector 不需要指定,而是会在运行期依据状况自我调整长度,动态增大容量

vector 的使用
#include <vector> std::vector<T> arr  // T 是 vector 要存储的对象集合的类型,该 vector 的变量名称是 arr




4. 标准模板库
STL
list(单向链表)

list
内部用数据结构的双向连结串列来实现,内部元素内存各处,互相以
link
串接起来,每个元素都只知道其前一个元素以及下一个元素的位置。故要遍历整个list,必须从第一个元素开始逐个往下寻访(顺序链式访问,所以只能使用迭代器进行遍历)不支持随机存取(Random Access)

list
的强项是高效的插入以及删除,
list
插入或删除时只需要改动元素的
link
字段,不需要搬动元素,相对
数组、vector
等要高效。

list
在经常需要于集合内部任意位置(即除了头尾以外的其他位置) 频繁增删元素的工作上表现优秀。若仅需要于集合尾端增删元素,那应该优先考虑
vector
容器,若仅于头尾二端增删元素,那应该优先考虑
deque
容器。 -
list
的使用:
std::list<T> mylist;


list
链表中插入/删除一个节点

遍历
list
,找到目标位置

调用
insert/erase
,插入/删除一个节点

// 链表的遍历
for (list<int>::iterator iter = lst.begin(); iter != lst.end(); iter++)
{
int& value = *iter;
printf("%d, ", value);
}

// 删除值为3的节点
for (list<int>::iterator iter = lst.begin(); iter != lst.end(); iter++)
{
int& value = *iter;
if (value == 3)
{
lst.erase(iter);
break;
}
}




5. 标准模板库
STL
string

string
是字符串的基本模板类
std::basic_string
使用
typedef
定义的模板类实例

typedef basic_string< char, char_traits<char>, allocator<char> >  string;


string
本质上是以字符作为元素的
vector
特化版本;不存在0字符结尾这个概念,能装入’\0’这种数据

定义字符串变量:
using namespace std; string kk = "hello world!"


可以用
c_str()函数来获取
string 内部的字符串指针

6. 标准模板库
STL
map
用于快速查找

在map存储中,是按照键值对来存储的 “key-value”

无论存储了多少数据,总是可以通过
key
值,直接检索到
value
的值

list
使用遍历查找,但需要从头到尾,挨个对比,速度较慢;而map使用映射查找,速度很快
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: