一.容器简介
顺序容器
容器 | 模板 | 特点 |
向量容器 | vector | 从后面快速插入与删除,可以直接访问任何元素。 |
双向列表容器 | list | 从任何地方快速插入与删除 |
双端链表容器 | deque | 从前面或者后面快速插入与删除,可以直接访问任何元素。 |
遍历:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec;
int n;
while(cin >> n){
vec.push_back(n);
}
for(int i=0;i<vec.size();++i){
cout << vec[i] << endl;
}
//指针遍历数组
int arr[] = {1,2,3,4,5,6};
int* p = arr;
while(p!=arr+6){
cout << *p << " ";
++p;
}
cout << endl;
//迭代器写法(类似指针)
vector<int>::iterator it = vec.begin();
while(it!=vec.end()){
cout << *it << " ";
++it;
}
cout << endl;
//const类型:
const vector<int> cvec = vec;
vector<int>::const_iterator cit = cvec.cbegin();
while(cit!=cvec.cend()){
cout << *cit << " ";
++cit;
}
cout << endl;
//C++11 begin() end()
vector<int>::iterator it2 = begin(vec);
while(it2 !=end(vec)){
cout << *it2 << " ";
++it2;
}
cout << endl;
int* q = begin(arr);
while(q!=end(arr)){
cout << *q++ << " ";
}
cout << endl;
//C++ base-scope-for
for(int n:arr){//arr依次把每个值赋给n
cout << n << " ";
}
cout << endl;
for(int n:vec){//vector也支持
cout << n << " ";
}
cout << endl;
}
list的写法和vector的插入删除:
#include<iostream>
#include<list>
#include<vector>
using namespace std;
//用list遍历:
int main(){
list<int> li;
for(int i=0;i<10;i++){
li.push_back(i);
//list也有头插
//li.push_front(i);
}
//2.vector只提供了尾部插入删除 push_back()/pop_back()
// list同时提供了头部插入删除 push_front()/pop_front();
//1.不能使用下标访问/随机访问,list不是连续的
//使用STL迭代器
list<int>::iterator it = li.begin();
while(it!=li.end()){
cout << *it << " ";
*it = 10 + *it;//可以修改值(每个值加10)
++it;
}
cout << endl;
const list<int> cli = li;
list<int>::const_iterator cit = cli.begin() ;
while(cit!=cli.end()){
cout << *cit << " ";
++cit;
}
cout << endl;
//3.list提供元素删除 remove()
li.remove(15);
//4.排序(默认正序)
li.sort();
//begin() end()
//C++11 STL base-scape-for
for(int n:li){
cout << n << " ";
}
cout << endl;
//C++11特有:大括号初始化
list<int> li2 = {4,7,2,3,1};
for(int n:li2){
cout << n << " ";
}
cout << endl;
//list访问第n个元素
//使用迭代器:
list<int>::iterator it2 = li2.begin();
//++it2;
//++it2;
advance(it2,2);//迭代器向后移动两次
cout << *it2 << endl;//访问第三个元素
cout << *it2 << " " << distance(li2.begin(),it2) << endl;//当前it2前有几个数字
//or:
list<int>::iterator it3 = li2.end();
//--it3;
//--it3;
advance(it3,-2);//迭代器向前移动两次
cout << *it3 << endl;
cout << *it3 << " " << distance(li2.begin(),it3) << endl;
//vector头部插入
vector<int> vec = {2,4,6,8,1,3,5};
vec.insert(vec.begin(),100); //在vec开头插入100
for(int n:vec){
cout << n << " ";
}
cout << endl;
//在第二个数字后插入200
vector<int> ::iterator it4 = vec.begin();
advance(it4,2);
vec.insert(it4,200);
for(int n:vec){
cout << n << " ";
}
cout << endl;
//删除vector第一个数字
vec.erase(vec.begin());
for(int n:vec){
cout << n << " ";
}
cout << endl;
//删除vector中的语句
vector<int> ::iterator it5 = vec.begin();//每次都重新获取一遍
advance(it5,1);
vec.erase(it5);
for(int n:vec){
cout << n << " ";
}
cout << endl;
}
erase删除一段元素时应注意:
如果没有erase操作,再将迭代器指向下一个元素。
vector<int>::iterator itr = v.begin();
while (itr!=v.end())
{
if (*v==1)
{
itr=v.erase(itr);
}
else
itr++;
}
二.容器通用操作
1.实例化
实例化方式 | 作用 | 顺序容器 | 关联容器 | 容器适配器 |
C <T> c | 默认构造 | √ | √ | √ |
C c(c1) | 复制构造 | √ | √ | √ |
C c(it_b,it_e) | 范围构造 | √ | √ | √ |
C c(n,t) | 填充构造 | √ | x | x |
C c(n) | 初始化大小 | √ | x | x |
#include<iostream>
#include<list>
#include<vector>
using namespace std;
template<typename T>
void PrintContainer(const T& c){
for(int n:c){
cout << n << " ";
}
cout << endl;
}
int main(){
//初始化指定个数,指定值
list<int> li(5,10);//构造5个10
PrintContainer(li);
//把list数据放进vector
vector<int> vec(li.begin(),li.end());
PrintContainer(vec);
for(int&n n:vec){//加了“&”引用才可以改值
n = 100;
}
PrintContainer(vec);
stack<int> s;
for(int n:vec){//入栈
s.push(n);
}
//栈与队列不能直接遍历,也没有迭代器
while(!s.empty()){
cout << s.top() << " ";
s.pop();//只能用出栈的方式输出
}
cout << endl;
//队列:
queue<int> q;
for(int n:vec){//入队
q.push(n);
}
while(!q.empty()){
cout << q.front() << " ";
q.pop();//只能用出栈的方式输出
}
}