这几天在学习STL,可能有些地方讲的不对,还请各位大佬指出错误,谢谢。
关于STL
STL是指C++的标准模板库(Standard Template Library)
提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
C++ 标准模板库的核心包括以下三个组件:
容器(Containers) 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms) 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators) 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
今天要分享的是STL组件中的容器,例如vector, map, set(),下面会有一些解释和用法的介绍,还有相关例题。
1.不定长数组:Vector
vector是一个不定长数组,vector和数组具有同样的内存处理方式。这里需要和数组区分开来的是:数组是静态空间,一旦分配了就不能被改变,因而空间的分配非常地不灵活;vector是动态空间,即空间可以被动态分配,因而空间的分配很灵活。可以说vector是相对数组的一种更高级的数据结构。vector是一个模板类,所以需要通过 vector a和vectorb这样的方式来声明一个vector。
{(PS:C语言中的动态存储分配)
当程序结束后,它申请的内存空间会怎么样?}
下面介绍一些常用的操作:
假设a是一个vector,
- a.size() : 可以获取它的大小;
- a.resize() : 可以改变它的大小;
- a.push_back() :可以向尾部添加元素(类似Python列表操作 .append();
- a.pop_back() : 可以删除最后一个元素(类似Python列表操作 .pop();
- a.empty() :可以测试vector是否为空;
关于vector的一个用法,这里也在lentcode找到一个比较简单的题目
题目大概的意思是股票每天会跌涨,算出最大利润,这道题和平常的题目不一样的地方在于:它没有给出具体的天数,因此无法通过直接循环来读取数据。而正好,vector是不定长数组,可以由实际数据灵活地申请空间,.(PS:关于C++类了解不多,lentcode给的模板如下)
class Solution {
public:
int maxProfit(vector<int>& prices) {
}
};
其中代码中,在参数名之前加一个”&“符号,就表示这个参数按照传引用的方式传递,是变量的”别名“,可在一定程度上代替C中的指针
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum=0,n=prices.size();
for(int i=0;i<n-1;++i){
if(prices[i] < prices[i+1])
sum += prices[i+1] - prices[i];
}
return sum;
}
};
2. 集合:set
set,其实类似于数学上的集合,而集合的性质之一———每个元素最多只出现一次,但两者的不同之处是:set的所有元素都是有序的。
3. 映射:map
map,从键(key)到值(value)的映射,就是类似于数学上的函数,例如y=x^2,即y值可以对应多个x值,而x只能对应一个y值。也类似于Python的字典。因为重载了[]运算符,map像是数组的”高级版“,也称为”关联数组“,举个栗子:可以可以用一个map<string,int>mouth_name来表示”月份到月份编号“的映射,然后用mouth_name[“July”]=7这样的方式来赋值。
- 关于重载
同一个标识符在不同的上下文有不同的意义。
- 关于set和map操作
两者都支持以下操作:
- insert(key_value):由下图介绍可知,如果在set或者map里面没有与插入元素等价的元素,则将其插入到容器相应的位置,如果有,则不将元素插入容器,返回这个已经存在元素的迭代器(如果该函数返回的是一个值)
- find():返回值是一个迭代器,成功返回迭代器指向要查找的元素,失败返回的迭代器指向end。
- count(key_value) :由下图介绍可知,所有元素在容器里都是唯一的,因而返回值只能是1(元素被找到)或者0(未找到元素),可以判断键值元素是否存在。