一、容器共有的成员函数
1.所有容器
- int size()
- bool empty()
2.顺序容器和关联容器(返回迭代器的,容器适配器不支持迭代器)
- begin()
- end()
- rbegin()
- rend()
- iterator erase(iterator i)
- iterator erase(iterator first,iterator last)
- clear()
3.顺序容器(没有自动排序,所以和位置有关的函数才有意义) - T & front():返回第一个元素的引用
- T & back()
- push_back()
- pop_back()
- iterator insert(iterator i,const T & val)
- iterator insert(iterator i, iterator first, iterator last)
二、动态数组vector,双向队列deque(支持随机访问迭代器的顺序容器)
1.构造函数
- vector()
- vector(int n):初始化为有n个元素
- vector(int n,const T &val)
- vector(iterator first,iterator last)
2.成员函数
- 一、中所有函数都可以用
- void swap(vector &v)
- vector 和 deque 的区别是deque在头尾增删都有较好的性能,而vector在头部增删很慢,因此deque比vector多出的成员函数有:push_front(const T &v),pop_front(0
三、双向链表list(支持双向迭代器的顺序容器)
1.与vector不同的成员函数(主要区别在于可以在任意位置增删,不支持随机访问迭代器)
- push_front(),pop_front()
- sort():vector,deque可以用算法sort()排序,由于链表不支持随机访问迭代器所以只能用自己的成员函数sort()
- void remove(const T &val)
- remove_if()
- void unique(): 删除和前一个元素相等的元素
- void merge(list &x):将链表x与当前链表合并并清空x,要求两个链表都是有序的
- void splice(iterator i,list &x,iterator first,iterator last):将x中[first,last)区间插入到i之前,并在x中删除该区间
2.例:约瑟夫问题
#include <list>
#include <iostream>
using namespace std;
int main(){
list<int> monkeys;
int n,m;
while(true){
cin>>n>>m;
if(n==0&&m==0){
break;
}
monkeys.clear();//一定记得清空!!!因为不同组数据需要重新生成list
for(int i=0;i<n;++i){
monkeys.push_back(i+1);
}
list<int>::iterator it=monkeys.begin();
while(monkeys.size()>1){
for(int i=1;i<m;++i){
++it;
if(it==monkeys.end()){
it=monkeys.begin();
}
}
it=monkeys.erase(it);
if(it==monkeys.end()){
it=monkeys.begin();
}
}
cout<<monkeys.front()<<endl;
}
}