C++ STL容器大全 string vector stack queue list priority_queue set map pair

数据结构(容器)

string类

Vector

vector 向量 ->不定长数组
#include

定义

vector<元素类型>
方法一

vector<int> v1;
vector<vector<int>> v2;
vector<vector<vector<int>>> v3;

方法二

vector<int> v1(5,10);
vector<vector<int>> v2(5,vector<int>(5,10));
vector<vector<vector<int>>> v3(5,vector<int>(5,vector<int>(5,10)))
尾插尾删

尾插

v.push_back(123);

尾删

v.pop_back();
插入

insert(iter,value)
insert(iter,num,value)

参数不支持下标
返回新插入值的迭代器

v.insert(v.begin()+3,666);
//在第3个位置插入666
v.insert(v.begin()+6,6,6);
//在第6个位置插入6个6
删除

eraser(iter)
eraser(first_iter,last_iter)
参数不支持下标

v.erase(v.begin()+3);
//删除第3个位置的值
v.erase(v.begin()+1,v.begin()+6);
//删除第1-6个位置的值
//全删
v.clear()
访问
//获取头尾迭代器
v.begin();
v.end();

v.rbegin();
v.rend();

//vector允许使用索引
v[n]=0;
v.at(index);

//返回第一个元素的值
v.front();
//返回最后一个元素的值
v.back();
其他
//判断是否为空
v.empty();
//修改长度
v.resize(len);
//获取长度
v.size();
//交换
v.swap(v2)
List

list 列表 ->双向链表
#include

定义

list<元素类型>

list<int> l1;
list<int> l2{1,2,3,4,5,6};
插入

insert(iter,value)
insert(iter,num,value)

参数不支持下标

l.insert(l.begin()+3,666);
//在第3个位置插入666
l.insert(l.begin()+6,6,6);
//在第6个位置插入6个6

头插

l.push_front(123);

尾插

l.push_back(123);
删除

eraser(iter)
eraser(first_iter,last_iter)
参数不支持下标

l.erase(l.begin()+3);
//删除第3个位置的值
l.erase(l.begin()+1,l.begin()+6);
//删除第1-6个位置的值

头删

l.pop_front();

尾删

l.pop_back();

list没有clear()

访问
//获取头尾迭代器
l.begin();
l.end();

//返回第一个元素的值
l.front();
//返回最后一个元素的值
l.back();
其他
//判断是否为空
l.empty();
//修改长度
l.resize(len);
//获取长度
l.size();
//交换
l.swap(v2)
Stack

Stack->栈
栈 先进后出
#include

定义

stack<元素类型>

stack<int> st;
入栈

参数不支持下标

st.push(666);
//666入栈
出栈
st.pop();
//出栈
访问
//获取头尾迭代器
st.begin();
st.end();

//返回头元素
st.top();
其他
//判断是否为空
st.empty();
//获取长度
st.size();
//交换
st.swap(st2)
Queue

Queue->队列
队列 先进后出(FIFO)
#include

定义

queue<元素类型>

queue<int> q;
入队列

参数不支持下标

q.push(666);
//666入队列
出队列
q.pop();
//出队列
访问
//获取头尾迭代器
q.begin();
q.end();

//返回第一个元素的值
q.front();
//返回最后一个元素的值
q.back();
其他
//判断是否为空
q.empty();
//获取长度
q.size();
//交换
q.swap(q2)
priority_queue

priority_queue->优先队列
#include

底层原理是二叉堆

定义

priority_queue<元素类型, 底层容器, 比较器>

priority_queue<int> pq;
priority_queue<int,vector<int>,less<int>> pq;//默认
priority_queue<int,vector<int>,greater<int>> pq;
入队列

参数不支持下标

pq.push(666);
//666入队列
出队列
pq.pop();
//出队列
访问
//获取头尾迭代器
pq.begin();
pq.end();

//获取堆顶元素
pq.top();
其他
//判断是否为空
pq.empty();
//获取长度
pq.size();
//交换
pq.swap(pq2)
Set

Set->集合
#include
set会自动去重和排序

底层原理是红黑树

定义

set<元素类型,比较器>

set<int> s;
set<int,less<int>> s;//默认
set<int,greater<int>> s;
插入

参数不支持下标

//666插入集合 自动去重
s.insert(666);
删除
//删除200这个元素
s.erase(s.find(200));
查找
//查找200这个元素 返回迭代器
s.find(200);
//查找200这个元素 返回元素数量
s.count(200);
访问
//获取头尾迭代器
s.begin();
s.end();
其他
//判断是否为空
s.empty();
//获取长度
s.size();
//交换
s.swap(s2);
Map

Map->字典dictionary
#include

底层原理是红黑树

定义

map<键类型,值类型,比较器>

map<char,int> m;
map<char,int,less<int>> m;//默认
map<char,int,greater<int>> m;
插入
m['a']=123;
//注意
//运行 m['b']
//如果键'b'不存在
//那么自动新增这个键,值为0
删除
//删除键为'a'的元素
m.erase(s.find('a'));
查找
//查找'a'这个键 返回迭代器
m.find('a');
//查找'a'这个键 返回元素数量
m.count('a');
访问
//获取头尾迭代器
m.begin();
m.end();
其他
//判断是否为空
m.empty();
//获取长度
m.size();
//交换
m.swap(m2);
Pair

pair->数对
#include
太简单不想讲

定义

pair<第一个元素类型,第二个元素类型>

pair<int,int> p;
pair<int,int> p={1,2};
更改
p.first=1;
p.second=2;
访问
p.first;
p.second;
关于STL容器遍历
方法一

适用于vector等支持下标的容器

for (int i = 0; i < a.size(); i++){
    cout << a[i] << endl;
}
方法2

几乎都适用

for (vector<int>::iterator it = a.begin(); it != a.end(); ++it){
    cout << *it << endl;
}
方法3(C++11)

几乎都适用

for (auto p:a){
    cout << *p << endl;
    //map要这样写
    //cout << p.first << ' ' << p.second << endl;
    //因为p是pair类型
}

千万不要在遍历中随便修改容器

你可能感兴趣的:(C++,数据结构,c++)