stl在编程中真是太重要了,计划近期将几个常用的容器好好研究下。
list是双向循环链表,
list每次增加一个元素,只需为新增节点申请一个单元,不存在重新申请所有内存的情况,它的成本是恒定的。而vector每当增加关键元素的时候,都需要重新申请新的更大的内存空间,会调用元素的自身的复制构造函数,存在构造成本。在销毁旧内存的时候,会调用析构函数,存在析构成本。所以在存储复杂类型和大量元素的情况下,list比vector更有优势
下面代码用到了list的一个初始化方法和增加元素的方法
注意用指针初始化时第二个指针指向最后一个元素的下一位置。
int data[6]={3,5,7,9,2,4};
list<int> lidata(data, data+6);
lidata.push_back(6);
list的所有成员函数:
front() 返回第一个元素
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
end() 返回末尾的迭代器
rbegin() 返回指向第一个元素的逆向迭代器
rend() 指向list末尾的逆向迭代器
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
clear() 删除所有元素
empty() 如果list是空的则返回true
erase() 删除一个或一个范围元素
insert() 插入一个元素到list中
remove() 从list删除元素
remove_if() 按指定条件删除元素
get_allocator() 返回list的配置器
assign() 给list赋值
splice() 合并两个list
merge() 合并两个list
max_size() 返回list能容纳的最大元素数量
size() 返回list中的元素个数
resize() 改变list的大小
reverse() 把list的元素倒转
sort() 给list排序
swap() 交换两个list
unique() 删除list中重复的元素
#include <iostream>
#include <list>
#include <string>
#include <numeric> //accumulate函数
#include <algorithm> //sort函数
using namespace std;
int cmp1(int a,int b)
{
return a<b;
}
namespace std{
/*struct greater<int>: binary_function<int, int, int>{
int operator()(int a,int b) const
{
return a<b;
}
*/
//sort成员函数自定义比较函数时只认greater<类型>
struct greater<int> {
bool operator() (int x, int y) const
{return x>y;}
};
}
bool single_digit(const int& value){return(value<3);}
class is_odd
{
public:
bool operator() (const int& value) {return (value%2)==1; }
};
int main()
{
typedef list<int> listc;
int a[]={7,5,6,4,3,2,1};
listc list1(a,a+sizeof(a)/sizeof(int)); //sizeof(a)/sizeof(int)=7
//显示list中元素
listc::iterator it0=list1.begin();
while(it0!=list1.end())
{
cout<<*it0<<" ";
it0++;
}
cout<<endl;
//stl算法
//数组也可以用accumulate来求和int sum=accumulate(a,a+sizeof(a)/sizeof(int),0),前两个参数用指针表示范围,第三个参数表示累加初始值
//求list中最大和最小值,第三个参数可以自定义,也可以不要该参数
reverse(list1.begin(),list1.end());
//sort(list1.begin(),list1.end());此调用是错误的,STL的sort函数只能为提供随机存取元素的容器里面的元素排序,而list是链表,不能随机存取,排序时有专门的自己的成员函数可供使用
list1.sort();
list1.sort(greater<int>()); //从大到小排列 list1={7,6,5,4,3,2,1}
//显示list中元素
it0=list1.begin();
while(it0!=list1.end())
{
cout<<*it0<<" ";
it0++;
}
cout<<endl;
int sum=accumulate(list1.begin(),list1.end(),0); //sum=28
listc::iterator it1=max_element(list1.begin(),list1.end(),cmp1); //*it1=7
listc::iterator it2=min_element(list1.begin(),list1.end(),cmp1); //*it2=1
//list的正反向迭代器
listc::iterator it3=list1.begin();
listc::reverse_iterator it4=list1.rbegin();
//从前面和后面向listOne容器中添加,删除数据
list1.push_front (0);
list1.push_back (10); // list1={0,...,10}
list1.pop_front ();
list1.pop_back (); // list1={...}
int s=list1.front(); //表示list第一个元素s=7;
int e=list1.back(); //表示list最后一个元素e=1;
bool f=list1.empty(); // 如果list是空的则返回true ,这里f=false;
// listc::iterator it5=list1.find(1); //错误,没有find成员函数
list1.insert(it3,99);
cout<<*it3<<endl; //此时it3仍然指向原来的元素7
// list1.erase(list1.begin(),list1.begin()+2); //错误,list迭代器不支持+n,只能++
listc::iterator s1=list1.begin();
listc::iterator s2=s1;
for(int j=1;j<3;j++)
s2++;
list1.erase(s1,++s2); //将(s1...s2-1)范围内元素删除
// cout<<*s1<<endl; //错误,it3此时失效,输出是未知的
cout<<*s2<<endl; //正确
list1.push_back(1);
list1.push_front(1);
// list1.unique(); //使用错误,不管是STL还是成员函数,必须先进行排序,才能使用unique,
list1.sort();
list1.unique(); //删除重复的元素
int b[]={3,3,3,4,4,4};
listc list2(b,b+6);
/*
list1.swap(list2); //list1和list2的内容互换
list1.splice(++list1.begin(),list2); //list2变为空,在list1的第二个元素之前插入list2
cout<<list1.size()<<endl; //11
cout<<list2.size()<<endl; //0
*/
list1.merge(list2); //合成一个表按升序排序
cout<<list1.size()<<endl; //11
cout<<list2.size()<<endl; //0
list1.remove(3);
list1.remove_if(is_odd()); //编译出错,没整明白,有待研究、、、、、、、、、、、、、、、、、、、、、、、、、、、
//显示list中元素
it0=list1.begin();
while(it0!=list1.end())
{
cout<<*it0<<" ";
it0++;
}
cout<<endl;
return 0;
}