常用C++STL
一、vector动态数组
vector,可以理解为
动
态
数
组
动态数组
动态数组。顾名思义,就是可以增加、删除的数组。
但是vector怎么用呢?请看下面一个例子:
#include<iostream>
#include<vector>//要想使用vector,必须导入vector库。
using namespace std;
int main(){
vector<int> a;//这样就声明了一个int类型的动态数组
a.push_back(4);//表示在数组中增加4这个数。数组内容为:{4}
a.push_back(5);//{4,5}
a.push_back(6);//{4,5,6}
cout << a.size() << endl;//a.size()表示动态数组的长度,即有多少个元素。
a.clear();//清空数组
cout << a.size() << endl;
return 0;
}
运行结果为:
3
0
注:vector是用指针链表实现的,所以比一般的数组要快
二、set集合
集合,是数学中的一个定义,这里就不多说了。在c++里,用set表示集合。而且,c++里的集合有如下的特征:
①不会有重复元素,如果有重复元素会自动删除其中一个。
②自动按照从小到大的顺序进行排列。
注:set是用红黑树(又称自动排序树)实现的,比vector及一般的数组都要快。
#include<iostream>
#include<set>//要想使用set,必须导入set库。
using namespace std;
int main(){
set<int> a;//这样就声明了一个int类型的集合
a.insert(4);//表示在集合中增加4这个数。集合内容为:{4}
a.insert(5);//{4,5}
a.insert(6);//{4,5,6}
a.erase(5);//表示删除5这个数。集合内容为:{4,6}
a.erase(7);//虽然集合里没有7,但删了也不报错。{4,6}
if(!a.count(3)){//a.count(3)就表示集合a里3的数量,由于最多只能是一个,所以用来判断有没有3。
a.insert(3);//由于集合里没有3,所以就插入了3。{3,4,6}
}
cout << a.size() << endl;//a.size()表示集合的长度,即有多少个元素。
//输出时千万不能用普通的输出方式,否则会报错的。必须要用迭代器。
for(set<int>::iterator it = a.begin(); it != a.end(); it++){//特别注意,it是一个指针。
cout << *it << " ";//由于it是一个指针,所以要用*it。
}
a.clear();//清空集合
return 0;
}
运行结果:
3
3 4 6
此外,还有一些算法。时间复杂度请见下表:(n为元素个数)
函数 | 功能 | 时间复杂度 |
---|---|---|
insert | 插入一个元素 | O ( l o g n ) O(logn) O(logn) |
erase | 删除一个元素 | O ( l o g n ) O(logn) O(logn) |
count | 统计个数 | O ( l o g n ) O(logn) O(logn) |
size | 获取元素个数 | O ( 1 ) O(1) O(1) |
clear | 清空集合 | O ( n ) O(n) O(n) |
另外的函数,详见官方参考文档.
附加:结构体与集合
结构体在放到集合里时会报错,因为计算机并不知道结构体之间怎么比大小。所以,需要重载运算符号。下面我们来看一下实例:
输入一些点的x、y坐标,要求按从小到大的顺序输出。
按往常来,我们先建造一个点的结构体。
struct Node{
int x, y;
//重头戏来了
bool operator< (const Node &rhs) const{//第一行有点难理解,只需要记忆就行了。
if(x == rhs.x){
return y < rhs.y;
} else {
return x < rhs.x;
}
}
};
接着,就可以放进set并输出了。
int main(){
int n;
set<Node> v;
cin >> n;
for(int i = 0; i < n; i++){
Node temp;
cin >> temp.x >> temp.y;
v.insert(temp);
}
for(set<Node>::iterator it = v.begin(); it != v.end(); it++){
cout << it->x << " " << it->y << endl;//it->x就相当于(*it).x。
}
return 0;
}
三、map映射表
map,映射表。既然叫映射表,就得由两个元素组成一对,那map就存储这一对一对的元素。所以,在创建时,应该有两个内容,第一个是关键字,第二个是值。例如, m a p < s t i r n g , i n t > map<stirng, int> map<stirng,int>就创建了一个字符串映射整数的集合。有的小伙伴可能不理解映射,是就相当于关联的意思。
#include<map>
...
int main(){
map<string, int> m;//m是一个映射表,表示每个同学所在的班级。
return 0;
}
初始的时候,m映射表是空的,想要插入一个元素,有两种方法。
1.利用函数。
m.insert(make_pair("Tom", 1));
m.insert(make_pair("Alice", 2));
m.insert(make_pair("John", 1));
m.insert(make_pair("Tom", 2));//因为Tom已经映射了1,就不能映射2了。所以本次操作无效。
2.直接插入。(比较方便)
m["Tom"] = 1;//等价于m.insert(make_pair("Tom", 1))。
m["Alice"] = 2;
m["John"] = 1;
想要输出,直接用:
cout << "Tom is in class " << m["Tom"] << endl;
运行结果:
"Tom is in class 1"(不带引号)
想要知道一个元素是否在映射表里,就可以用count函数。
if(count("Mary")){
cout << "Mary is in class " << m["Mary"];
} else {
cout << "Mary has no class."
}
拜拜!记得点赞关注哦!