C++顺序容器总结
1.什么是容器
容器,顾名思义,装东西的东西。对于我们程序设计来讲,如何将一系列的信息存储到计算机里是我们应该经常思考的事情,我们可以用到一些数据结构:数组,用线性表,用队列,用树与图,而C++的stl库中就这样给我们创建了这一些的容器(数据结构+方法),我们可以使用容器特定的方法进行数据的访问与写入。
2.基本容器
2.1 vector
vector类似于数组,可以进行下标访问。
实例,现阶段用到:初始化、遍历、插入和删除。
函数 | 作用 |
---|---|
vec.begin(); | 返回首元素地址 |
vec.end(); | 返回尾元素地址的下一个地址 |
vec.push_back(value); | 向后插入value |
vec.pop_back(); | 出栈/删除末尾元素 |
vec.empty(); | bool类型,容器为空为真 |
vec.size(); | 返回容器长度 |
vec.insert(); | 插入,基于迭代器位置 |
vec.erase(); | 删除,基于迭代器位置,删除元素和迭代器 |
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int a[5] = {1,2,3,4,5};
vector<int> x;
//初始化
vector<int> y(a,a+5);
x.push_back(10);
x.push_back(20);
x.push_back(30);
x.push_back(40);
//遍历方法1:迭代器
vector<int> :: iterator it ;
for(it = x.begin();it != x.end();it++)
cout << *it <<endl;
//遍历方法2:
vector<int> :: size_type i;
for (i = 0 ; i < x.size();i++)
cout << x[i] <<endl;
//插入:
it = x.begin();
x.insert(it,22);
x.insert(x.end(),33);
x.insert(x.end(),y.begin(),y.end());
for (i = 0 ; i < x.size();i++)
cout << x[i] <<endl;
cout << endl;
//删除
it = x.begin();
x.erase(it);
//x.erase(++it);
x.erase(x.begin(),--x.end());
for (i = 0 ; i < x.size();i++)
cout << x[i] <<endl;
return 0;
}
2.2 deque
deque是stl标准库中基本容器:双向队列;
deque的操作:
d.push_back(value);
d.push_front(value);
d.pop_front(value);
d.pop_back(value);
2.3 list
list操作总结:
前插:list.push_front(int);
后插:list.push_back(int);
插入:list.insert(迭代器,int);
list.insert(a.begin(),b.begin(),b.end())将b插入a
list.insert(迭代器,4,20)将4个20插入迭代器位置
删除:list.erase(迭代器);
list.erase(a.begin(),a.end());
排序:list.sort();
反转:list.reverse();
1.插入操作
#include <iostream>
#include <list>
using namespace std;
void print(const list<int>& listput);
int main()
{
list<int> a,b;
b.push_back(100);
b.push_back(200);
b.push_back(300);
b.push_back(400);
b.push_back(500);
a.push_front(4);
a.push_front(3);
a.push_front(2);
a.push_front(1);
a.push_back(5);
//插入list操作
a.insert(a.begin(),10);
a.insert(a.end(),4,20);
a.insert(a.begin(),b.begin(),b.end()); //迭代器位置可以自行变化
print(a);
print(b);
return 0;
}
void print(const list<int>& listput)
{
//const_iterator 遍历的时候用到,不能修改值了
list<int>::const_iterator iter;
for (iter = listput.begin();iter != listput.end();iter++)
{
cout << *iter <<endl;
}
}
2.删除操作
#include <iostream>
#include <list>
using namespace std;
void print(const list<int>& listput);
int main()
{
std::list<int> a;
a.push_front(4);
a.push_front(3);
list<int>::iterator it;
it = a.insert(a.begin(),2);
a.push_front(1);
a.push_front(0);
a.erase(it);
a.erase(++a.begin(),a.end());
//从哪里到哪里,end指向的是尾元素的下一个元素
print(a);
return 0;
}
void print(const list<int>& listput)
{
list<int>::const_iterator iter;
for (iter = listput.begin();iter != listput.end();iter++)
{
cout << *iter <<endl;
}
}
3.反转和排序
#include <iostream>
#include <list>
using namespace std;
void print(const list<int>& listput);
int main()
{
std::list<int> a;
a.push_front(2);
a.push_front(56);
a.push_front(1);
a.push_front(33);
a.push_front(15);
print(a);
a.sort();
//排序
a.reverse();
//翻转
cout <<endl;
print(a);
return 0;
}
void print(const list<int>& listput)
{
list<int>::const_iterator iter;
for (iter = listput.begin();iter != listput.end();iter++)
{
cout << *iter <<endl;
}
}
3.自适应容器
3.1 queue
3.2 stack
//stack相当于一个容器适配器,不是独立的容器
stack<int,deque<int>> a; //用数组
stack<int,vector<int>> b; //用容器
stack<int,list<int>> c; //用链表
stack<int> d; //默认deque作堆栈
操作:
s.empty(): 检测是否为空
s.size(): 堆栈大小
s.pop(): 出栈(不返回,只删除)
s.top(): 栈顶值(查看,不删除)
s.push(value): 压栈
#include <iostream>
#include <stack>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
//stack相当于一个容器适配器,不是独立的容器
int main()
{
stack<int,deque<int>> a; //用数组
stack<int,vector<int>> b; //用容器
stack<int,list<int>> c; //用链表
stack<int> d;//默认deque作堆栈
d.push(25);
d.push(10);
d.push(1);
d.push(5);
cout << "现在栈里有"<<d.size()<<"个数据"<<endl;
int x = d.top();
d.pop();
cout << x <<endl;
cout << "现在栈里有"<<d.size()<<"个数据"<<endl;
x = d.top();
d.pop();
cout << x <<endl;
cout << "现在栈里有"<<d.size()<<"个数据"<<endl;
//while(d.size() != 0)
while(d.empty() == false)//如果不为空
{
int x = d.top();
d.pop();
cout << x <<endl;
}
return 0;
}
3.3 priority_queue
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
priority_queue<int,vector<int>> pq;//默认(最大值优先级队列)
priority_queue<int,deque<int>,greater<int>> pq2;
//加入谓词greater变为最小值优先级队列
pq.push(10);
pq.push(20);
pq.push(5);
pq.push(30);
cout <<"优先级队列一共有"<<pq.size()<<"个数据"<<endl;
cout << pq.top()<<endl;
while(!pq.empty())
{
cout <<"从优先级队列里删除"<<pq.top()<<endl;
pq.pop();
}
pq2.push(10);
pq2.push(20);
pq2.push(-1);
pq2.push(30);
cout << pq2.top()<<endl;
while(!pq2.empty())
{
cout << pq2.top()<<endl;
pq2.pop();
}
return 0;
}