总结
- 序列容器Vector,deque,list
- 关联容器 map set
- 容器适配器: 是对前面提到的某些容器vector进行包装,使其变成另外一个容器
如stack,queue
1.序列容器
- 如果程序要求随机访问元素,则用vector或者deque
- 如果程序必须在容器中间位置插入或删除元素,用list
- 如果程序不是在容器的中间位置,而是在容器的首部和尾部插入或删除元素则用deque
vector
动态数组的封装,可以用下标访问
vec容器可以存放多种数据类型
------------构造方法-------------------------
vector<int> vec(10,0) //创建容量为10的vector,并初始化为0
vector<int> vec = {1,4,8}
vector<int> vec2(vec) //copy constructor, vec2: {1,4,8}
二维初始化
vector<vector<int>> vec(size1, vector<int>(size2, 0));
----------Modifiers--------------------
vec.push_back(4); //尾部插入
vec.insert(v1.begin()+2,0); //插入0至vec[2]
vec.pop_back(); //移除最后一个元素
vec.erase (vector.begin()+5);
vec.erase (myvector.begin(),myvector.begin()+3);
vec.clear(); //全部删除
----------Element access--------------------
vec[0];
vec.front();
vec.back();
----------Capacity--------------------
vec.size(); //vector元素数量大小
vec.empty();
------------常用算法---------------------------
//需要配合 #include <algorithm>算法
it = vec.find(first迭代器,last迭代器,val) // [first,last)
if(it != vec.end()) //找到了
------------------------------------------------------------------------
for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
cout << *it <<endl;
sort(vec.begin(),vec.end());
for(int i : vec) cout << i << endl;
for(int i = 0; i < vec.size(); i++) cout << vec[i] << endl;
- fast insert/remove at the end: O(1)
- slow insert/remove at the begin or int the middle: O(n)
- slow search: O(n)
deque
deque<int> deq = {3,4,6};
----------Modifiers--------------------
deq.push_front(2);
deq.pop_front();
deq.push_back(9);
deq.pop_back();
deq.clear();
----------Capacity--------------------
deq.empty();
deq.size();
----------Element access--------------------
deq[0]; //可以当做数组使用
deq.front();
deq.back();
- fast insert/remove at the begining and the end O(1);
- slow insert/remove in the middle: O(n)
- slow search: O(n)
list
双向链表
list<int> li = {1,2,3};
li.push_back(6);
li.push_front(0);
li.pop_front();
li.pop_back();
li.clear();
----------Element access--------------------
li.front();
li.back();
----------Capacity--------------------
li.size();
li.empty();
- fast insert/remove at any place: O(1)
- slow serarch:O(n)
- no random access, no [] operator
2.关联容器
二叉平衡树(红黑树)
set
set<int> st;
st.isnert(1);
st.earse(迭代器 或 value);
st.erase(iterator first, iterator last);
st.erase(st.find(50)); // find返回一个迭代器
st.clear();
----------Capacity--------------------
st.empty();
st.size();
example
// erasing from set
#include <iostream>
#include <set>
int main (){
set<int> myset;
set<int>::iterator it;
for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90
it = myset.begin();
++it; // "it" points now to 20
myset.erase (it);
myset.erase (40);
it = myset.find (60); //删除[60,st.end)
myset.erase (it, myset.end());
return 0;
}
map
map<int,string> mmp;
pair<int,string> p(1,"tom");
mmp.insert(p); //插入
mmp[2] = "jack"; //插入
mmp.insert(pair<int,string>(1,"tom"));
------------------------------------------
it = mmp.find(key);
mmp.erase(key);
mmp.clear();
for(auto& it : mmp)
cout << it.first << " " << it.second << endl;
3.其他(容器适配器)
stack
queue和stack一样都没有迭代器
stack<int> s;
s.push(1);
s.pop();
----------Capacity--------------------
s.size();
s.empty();
----------Element access--------------------
int top = s.top();
queue
queue<int> q;
q.push(1); //入队
q.pop(); //出队
----------Capacity--------------------
q.empty();
q.size();
----------Element access--------------------
q.front(); //队首元素
q.back(); //队尾元素
string
string str;
getline(cin,str); //读入一行,包括空格
cout << str << endl;
string s1 = "kcl";
string s2 = "2020";
s1.append(s2); // kcl2020
int len1 = s1.length();
int len2 = s2.length();
s1.erase(len1-len2,len1); // 把下标i到j的元素清除[i,j)
cout << s1 << endl; // kcl
cout << s1.find('c') << endl; //1
cout << s1.find('c',1) << endl; //从下标1开始查找'c'
4.erase总结
5.find()总结
序列容器没有find方法,需要配合 algorithm头文件使用