List,链表。
使用一个双向链表double-linked list来管理元素。
熟悉的声明
namespace std{
template <class T, class Allocator = allocator<T> >
class list;
}
1.List的能力
# 不支持随机存取
不支持operator[]、at()等下标subscript操作
它的迭代器也不是随机存取迭代器,而是双向迭代器
所以用到随机存储迭代器的算法也不能调用
# 在任何位置的插入删除效率高,常数时间完成
内部指针操作,无需移动任何其他元素
# 安插删除不会造成其他pointer、reference、iterator失效
# 不提供容量、空间重新分配等操作
# 提供不少特殊函数专门用于移动元素,较之同名的算法函数,效率更高
2.操作函数
构造和析构
list<Elem> t; list<Elem> t(n); list<Elem> t(t1);
list<Elem> t(n,elem); list<Elem> t(beg,end);
t.~list<Elem>();
Nonmodifying Operations:
t.size(); t.empty(); t.maxsize();
Comparison Operator;
Assignment:
t = t1; t.assign(n,elem); t.assign(beg,end);
t.swap(t1); swap(t,t1);
Element Access:
t.front(); t.back();
由于不做空指针检查,推荐如下使用
if(!t.empty()){
cout<<t.back()<<endl;
}
Iterator Functions
t.begin(); t.end();
t.rbegin(); t.rend();
Insetting and Remove
List提供Deque的所有功能,还增加了remove()和remove_if()运用在List的特殊版本。
List特别配置的remove算法的特别版本,作为成员函数,它们比remove算法效率更高。
t.insert(pos,elem); t.insert(pos,n,elem); t.insert(pos,beg,end);
t.push_back(elem); t.push_front(elem);
t.pop_back(); t.pop_front();
t.remove(val); t.remove(op); //op为一个判断式
t.erase(pos); t.erase(beg,end);
t.resize(num); t.resize(num,elem);
t.clear();
例子:
remove_if(not1(bind2nd(modulus<int>(),2))); //删除取余2不等以1的所有元素
Special Modifying Operations
t.unique();//删除重复数据 t.unique(op);//删除连续满足op判断式的重复元素
t.splice(pos,t1); t.plice(pos,t1,t1pos); t.splice(pos,t2,t2begin,t2end);
t.sort(); t.sort(op); //以op为准则或者以默认operator<为准则排序
t.merge(t1); t.merge(t1,op); //以op准则合并表
t.reverse(); //list reverse
3.实例
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
void printLists(const list<int>& t1,const list<int> t2){
cout<<"List1:"<<endl;
copy(list1.begin(),list1.end(),ostream_iterator<int>(cout," "));
cout<<endl<<"List2:"<<endl;
copy(list2.begin(),list2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
int main(){
list<int> list1,list2;
for(i = 0; i< 6; ++i){
list1.push_back(i);
list2.push_front(i);
}
printLists(list1,list2);
list2.splice(list2.end(),list2,list2.begin());
printLists(list1,list2);
list2.sort();
list1 = list2;
list2.unique();
printLists(list1,list2);
list1.merge(list2);
printLists(list1,list2);
}
使用一个双向链表double-linked list来管理元素。
熟悉的声明
namespace std{
template <class T, class Allocator = allocator<T> >
class list;
}
1.List的能力
# 不支持随机存取
不支持operator[]、at()等下标subscript操作
它的迭代器也不是随机存取迭代器,而是双向迭代器
所以用到随机存储迭代器的算法也不能调用
# 在任何位置的插入删除效率高,常数时间完成
内部指针操作,无需移动任何其他元素
# 安插删除不会造成其他pointer、reference、iterator失效
# 不提供容量、空间重新分配等操作
# 提供不少特殊函数专门用于移动元素,较之同名的算法函数,效率更高
2.操作函数
构造和析构
list<Elem> t; list<Elem> t(n); list<Elem> t(t1);
list<Elem> t(n,elem); list<Elem> t(beg,end);
t.~list<Elem>();
Nonmodifying Operations:
t.size(); t.empty(); t.maxsize();
Comparison Operator;
Assignment:
t = t1; t.assign(n,elem); t.assign(beg,end);
t.swap(t1); swap(t,t1);
Element Access:
t.front(); t.back();
由于不做空指针检查,推荐如下使用
if(!t.empty()){
cout<<t.back()<<endl;
}
Iterator Functions
t.begin(); t.end();
t.rbegin(); t.rend();
Insetting and Remove
List提供Deque的所有功能,还增加了remove()和remove_if()运用在List的特殊版本。
List特别配置的remove算法的特别版本,作为成员函数,它们比remove算法效率更高。
t.insert(pos,elem); t.insert(pos,n,elem); t.insert(pos,beg,end);
t.push_back(elem); t.push_front(elem);
t.pop_back(); t.pop_front();
t.remove(val); t.remove(op); //op为一个判断式
t.erase(pos); t.erase(beg,end);
t.resize(num); t.resize(num,elem);
t.clear();
例子:
remove_if(not1(bind2nd(modulus<int>(),2))); //删除取余2不等以1的所有元素
Special Modifying Operations
t.unique();//删除重复数据 t.unique(op);//删除连续满足op判断式的重复元素
t.splice(pos,t1); t.plice(pos,t1,t1pos); t.splice(pos,t2,t2begin,t2end);
t.sort(); t.sort(op); //以op为准则或者以默认operator<为准则排序
t.merge(t1); t.merge(t1,op); //以op准则合并表
t.reverse(); //list reverse
3.实例
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
void printLists(const list<int>& t1,const list<int> t2){
cout<<"List1:"<<endl;
copy(list1.begin(),list1.end(),ostream_iterator<int>(cout," "));
cout<<endl<<"List2:"<<endl;
copy(list2.begin(),list2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
int main(){
list<int> list1,list2;
for(i = 0; i< 6; ++i){
list1.push_back(i);
list2.push_front(i);
}
printLists(list1,list2);
list2.splice(list2.end(),list2,list2.begin());
printLists(list1,list2);
list2.sort();
list1 = list2;
list2.unique();
printLists(list1,list2);
list1.merge(list2);
printLists(list1,list2);
}