C++ STL
使用时注意using namespace std(C++命名空间)
1.vector向量容器
vector不仅可以像数组一样用脚标访问元素,还解决了数组长度固定的问题,可以在尾部插入元素,添加或删除时自动调节空间。
引用与创建:
#include<vector>
using namespace std;
int main(){
//创建整型向量容器v1
vector<int> v1;
//创建长度为3的字符串型向量容器v2
//下标从0开始计数
//创建使用的是函数,故为小括号(),访问时使用中括号如v2[3];
vector<char> v2(3);
//赋值
v2[2]='a';
//创建长度为10且每个元素都为5.5的浮点型向量容器
vector<float> v3(10,5.5);
}
函数 | 意义 |
---|---|
begin() | 返回首元素位置 |
end() | 返回最后一个元素下一个元素的位置 |
push_back(插入元素) | 在尾部扩张新元素 |
insert(插入位置,插入元素) | 在特定位置如v.begin()+2插入元素 |
erase(位置) | 删除特定位置的元素并释放内存 |
clear() | 清除所有元素 |
reverse(位置1,位置2) | 反向排列两个位置之间的元素 |
sort(位置1,位置2) | 对两个位置之间的元素排序,默认从小到大,可自己设计比较算法 |
size() | 返回向量的大小,即元素个数 |
empty() | 判断向量是否为空,是返回true |
使用迭代器遍历vector:
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> v(10);
for(int i=0;i<10;i++)v[i]=i;
//不使用迭代器
for(int i=0;i<10;i++)cout<<v[i]<<" ";
//换行
cout<<endl;
//使用迭代器输出
vector<int>::iterator it;//创捷迭代器
for(it=v.begin();it!=v.end();it++)cout<<*it<<" ";
}
所谓迭代器可以理解为泛型的指针。
2.string基本字符容器
C语言提供<string.h>库处理字符串数组,C++STL提供了string基本字符类型容器,可以理解为字符串类。
此处与Java泛型有区别,Java的String泛型’S’需要大写。
创建与使用:
#include<string>
#include<iostream>
using namespace std;
int main(){
//创建字符类型s
string s;
//给s赋值
s="helloword";
//尾部添加字符,用+
s=s+'!';
//尾部添加字符串,用+
s=s+"abcd";
//输出s[0]
cout<<s[0]<<endl;
//输出s
cout<<s<<endl;
}
常用函数
函数 | 意义 |
---|---|
begin() | 字符串初始位置 |
end() | 最后一个字符下一个位置 |
append(字符串) | 尾部添加字符串 |
insert(位置,字符) | 将字符插入到字符串位置之前,位置可以用迭代器判断 |
erase(位置) | 删除某位置的字符 |
erase(位置1,位置2) | 删除两个位置之间的字符 |
length() | 返回字符串的长度 |
empty() | 判断字符串是否为空,是返回true |
replace(位置,数量n,字符串) | 从给定位置开始,将连续的n个字符替换为指定字符串 |
find(“字符串”) | 查找子串,找到返回下标,找不到返回4294967295 |
s.compare(字符串) | 比较两个字符串大小,s大返回1,相等返回0,小返回-1 |
reverse() | 反向排序字符串 |
**string对象可以作为vector容器的元素。**效果类似字符串数组;
3.set集合容器
set集合容器实现了红黑树的数据结构,插入元素时会自动调整二叉树的排序。
所谓红黑树,即平衡二叉检索树,每个子树根节点值都大于其左子树所有节点的值,小于其右子树所有节点的值,检索效率高于vector,采用中序遍历即可以将元素从小到大排列出来。
set容器不允许插入相同的元素
multiset容器允许插入相同元素,其他和set相同
创建:
#include<set>
using namespace std;
int main(){
set<int> s;
}
常用函数:
函数 | 意义 |
---|---|
insert(元素) | 向容器中插入元素 |
begin() | 初始位置 |
end() | 末尾位置下一个位置 |
find(元素) | 检索元素,找到返回位置,否则返回s.end() |
clear() | 清除所有元素 |
erase(元素) | 删除元素为参数的节点 |
四、map映照容器
map映照容器的键值是由一个键值和一个映照数据组成的,数据结构同样由红黑树实现。
map不可插入相同元素
multimap可以插入相同元素
创建:
#include<map>
using namespace std;
int main(){
//string类型键值,float类型映照数据。
map<string,float> m;
//插入数据
m["helloword"]=5.5;
}
常用函数与set基本相同。
五、stack栈
Last In First Out,即后进先出的数据结构称为栈。
创建:
#include<stack>
using namespace std;
int main(){
stack<int> s;
}
常用函数:
函数 | 意义 |
---|---|
push(元素) | 入栈,栈顶插入元素 |
pop() | 出栈,删除栈顶元素 |
top() | 返回栈顶元素 |
size() | 返回栈中元素数量 |
empty() | 判断栈是否为空,是返回true |
六、queue队列
First In First Out,即先进先出的数据结构称为队列。
创建队列
#include<queue>
using namespace std;
int main(){
queue<int> q;
}
函数 | 意义 |
---|---|
push(元素) | 入队,队尾插入元素 |
pop() | 出队,删除队首元素 |
front() | 返回队首元素 |
back() | 返回队尾元素 |
size() | 返回队中元素数量 |
empty() | 判断队列是否为空,是返回true |
七、deque双端队列容器
deque双端队列容器与vector一样采用线性表存储结构,不同的是deque采用分块的线性存储结构,每块大小一般为512字节,所有的块由一个Map块管理。
创建与使用:
#include<deque>
using namespace std;
int main(){
//创建整型双端队列容器d1
deque<int> d1;
//创建长度为3的字符串型双端队列容器d2
//下标从0开始计数
//创建使用的是函数,故为小括号(),访问时使用中括号如d2[3];
deque<char> d2(3);
//赋值
d2[2]='a';
//创建长度为10且每个元素都为5.5的浮点型双端队列容器d3
deque<float> d3(10,5.5);
}
函数 | 意义 |
---|---|
begin() | 返回首元素位置 |
end() | 返回最后一个元素下一个元素的位置 |
push_back(插入元素) | 在尾部扩张新元素 |
push_front(插入元素) | 在头部扩张新元素 |
pop_front() | 删除头部元素 |
pop_back() | 删除尾部元素 |
erase(位置) | 删除特定位置的元素并释放内存 |
clear() | 清除所有元素 |
size() | 返回向量的大小,即元素个数 |
empty() | 判断向量是否为空,是返回true |
关于优先队列容器priority_queue:
优先队列容器与队列的区别在于出队不同,优先队列容器出队先出最大元素,而非队首元素,其余完全相同
八、list双向链表容器
创建list:
#include<list>
using namespace std;
int main(){
//创建空链表
list<int> l1;
//创建有十个元素的链表
list<int> l2(10);
}
常用函数:
函数 | 意义 |
---|---|
begin() | 返回首元素位置 |
end() | 返回最后一个元素下一个元素的位置 |
push_back(插入元素) | 在尾部扩张新元素 |
push_front(插入元素) | 在头部扩张新元素 |
insert(位置,元素) | 将字符插入到字符串位置之前,位置可以用迭代器判断 |
remove(元素) | 删除值为参数的元素 |
pop_front() | 删除头部元素 |
pop_back() | 删除尾部元素 |
erase(位置) | 删除参数位置的元素 |
clear() | 清除所有元素 |
find(元素) | 检索元素,找到返回位置,否则返回l.end() |
sort() | 对链表排序 |
unique() | 剔除重复元素,保留一个 |
clear() | 清除所有元素 |
find(元素) | 检索元素,找到返回位置,否则返回l.end() |
sort() | 对链表排序 |
unique() | 剔除重复元素,保留一个 |