C++中的vector对象和STL标准模板库
本文最后更新于:2 小时前
vector
为什么需要vector
- 封装任何类型的动态数组,自动创建和删除
- 数组下标越界检查
vector对象的使用
创建 vector<元素类型> 对象名
访问 vector对象名[下标表达式]
vector数组对象名不表示数组首地址
获得数组长度 vector对象名.size()
在自定义函数中传入vector参数列表 vector<元素类型> &数组名
基于范围的for循环配合auto
#include<vector> #include<iostream> int main() { std::vector<int> v = { 1, 2, 3 }; for ( auto i = v.begin(); i != v.end(); i++ ) { //i为指针,取出指针指向的元素使用*i std::cout << *i << std::endl; } for ( auto e : v ) { std::cout << e << std::endl; return 0; }
STL标准模板库
STL简介
- Standard Template Library定义了一套概念体系,为泛型程序设计提供了逻辑基础
- STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的
- 使用STL的模板时,类型参数既可以是C++标准库中已有的类型,也可以时自定义的类型–只要这些类型是所要求概念的模型
STL的基本组件
Iterators(迭代器)
Iterators(迭代器)是算法和容器的桥梁
- 将迭代器作为算法的参数、通过迭代器来访问容器,而不是把容器直接作为算法的参数
将函数对象作为的算法的参数,而不是将函数所执行的运算作为算法的一部分
使用STL中提供的或自定义的迭代器和函数对象,配合STL的算法,可以组合出各种各样的功能
- 提供了顺序访问容器中的每个元素的方法
- 可以使用++运算符来获得指向下一个元素的迭代器
- 可以使用*运算符访问迭代器所指向的元素,如果元素类型是类或结构体,还可以使用->运算符直接访问该元素的一个成员
- 有些迭代器还支持通过–运算符获得指向上一个元素的迭代器
- 迭代器是泛化的指针:指针也具有同样的特性,因此指针本身就是一种迭代器
- 使用独立于STL容器的迭代器,需要包含头文件<iterator>
container(容器)
- 容纳、包含一组元素的对象
- 基本容器类模板
- 顺序容器:array(数组)、vector(向量)、deque(双端队列)、forward_list(单链表)、list(列表)
- (有序)关联容器:set(集合)、multiset(多重集合)、map(映射)、multimap(多重映射)
- 无序关联容器:unordered_set(无序集合)、unordered_multiset(无序多重集合)、unordered_map(无序映射)、unordered_multimap(无序多重映射)
容器的通用功能
- 用默认构造函数构造空容器
- 支持关系运算符
- begin()、end()获得容器首、尾迭代器
- clear()将容器清空
- empty()判断容器是否为空
- size()得到容器元素个数
- s1.swap(s2)将s1和s2两容器内容交换
相关数据类型(S表示容器类型)
- S::iterator指向容器元素的迭代器类型
- S::const_iterator常迭代器类型
对可逆容器的访问
STL为每个可逆容器都提供了逆向迭代器,逆向迭代器可以通过下面的成员函数得到
- rbegin()指向容器尾的逆向迭代器
- rend()指向容器首的逆向迭代器
逆向迭代器的类型名的表示方法如下
- S::reverse_iterator逆向迭代器类型
- S::const_reverse_iterator逆向常迭代器类型
容器适配器
- stack(栈)
- queue(队列)
- priority_queue(优先队列)
function object(函数对象)
- 一个行为类似函数的对象,对它可以像调用函数一样调用
- 函数对象是泛化的函数:任何普通的函数和任何重载了()运算符的类的对象都可以作为函数对象使用
- 使用STL的函数对象,需要包含头文件<functional>
algorithms(算法)
可以广泛用于不同的对象和内置的数据类型
STL包括70多个算法
- 排序算法
- 消除算法
- 计数算法
- 比较算法
- 变换算法
- 置换算法
- 容器管理
- ……
使用STL的算法,需要包含头文件<algorithms>
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!