|
list 是个队列,它提供删除插入排序合并等方法,同时也可用迭代器进行查看.与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢. 它提供的的方法如下, 本文不一一指出,仅指出几个注意点. assign() 给list赋值 back() 返回最后一个元素 begin() 返回指向第一个元素的迭代器 clear() 删除所有元素 empty() 如果list是空的则返回true end() 返回末尾的迭代器 erase() 删除一个元素 front() 返回第一个元素 get_allocator() 返回list的配置器 insert() 插入一个元素到list中 max_size() 返回list能容纳的最大元素数量 merge() 合并两个list pop_back() 删除最后一个元素 pop_front() 删除第一个元素 push_back() 在list的末尾添加一个元素 push_front() 在list的头部添加一个元素 rbegin() 返回指向第一个元素的逆向迭代器 remove() 从list删除元素 remove_if() 按指定条件删除元素 rend() 指向list末尾的逆向迭代器 resize() 改变list的大小 reverse() 把list的元素倒转 size() 返回list中的元素个数 sort() 给list排序 splice() 合并两个list swap() 交换两个list unique() 删除list中重复的元素
1. 在使用STL list的过程中, 如果该类型包括指针成员变量, 那么list用起来非常麻烦.因为将一个成员变量push到list时执行的操作是将当前变量拷贝一份到list中.而将成员变量从list中移出时,变量的释放由list完成.因此,(1)变量所代表的类不能有析构方法;(2)变量中的指针指申请的资源释放成问题;
比如:
class CExample { public: CExample() { m_pExample = new char[1024*1024*1024]; }
private: long m_lExample; char *m_pExample; };
typedef std::list<CExample> ExampleList;
(1) CExample不能有自己的析构方法,否则使用ExampleList时会出错;
(2) m_pExample是在堆上分配出来的,当CExample的对象从ExampleList的对象中删除时,m_pExample所指向的空间不会被自动释放; 当需要的空间较大时只能用从堆上分配,而不能在stack上分配。
2. 对指定类型进行排序
#include <list> #include <iostream>
using namespace std;
class sot { public: sot(int i):m_iN(i) {
} int m_iN; };
struct sssgs { bool operator()(const sot* &s1,const sot* &s2) { if(s1->m_iN < s2->m_iN) return true; return false; } };
bool operator<(const sot& s1,const sot& s2) { if(s1.m_iN > s2.m_iN) return true; return false; }
ostream& operator<<(ostream &o2,sot& s) { o2<<s.m_iN<<endl; return o2; }
int main() { list<sot> listSot; list<sot>::iterator itrSot; for(int i = 0;i < 20;i++)listSot.push_back(sot(i)); sssgs sg;
// 排序 listSot.sort();
for(itrSot = listSot.begin();itrSot != listSot.end();itrSot++) cout<<*itrSot; return 0; }
3. 迭代期间的删除 std::list<int> m_list; std::iist<int>::iterator m_listiter; for (m_listiter = m_list.begin(); m_listiter != m_list.end(); m_listiter++) m_listiter = m_list.erase(m_listiter);
|
|