声明:为了文章简洁 本文多采用函数原型加代码示例的方式
本文使用的类源码和对象数据如下:
目录
class person
{
public:
string m_name;
int m_age;
person(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
};
person p1("孙悟空",199);
person p2("唐僧", 29);
person p3("沙僧", 299);
- list容器不支持随机访问迭代器 就是说只能对头尾进行访问操作 或者对迭代器进行++ --操作取访问指定位置
- 所有不可随机访问的迭代器都不可使用标准算法(如sort) 其内部会提供相关成员函数
(具体可见 反转与排序)
构造函数
- list<T> lst1; //T为任意数据类型
- list<T> lst2(const list& lst1); //拷贝构造函数
- list<T> lst3(lst1.begin() , lst1.end()); //拷贝某链表区间数据
list<person> lst1; list<person> lst2(lst1); list<person> lst3(lst1.begin(), lst1.end());
赋值和交换
- operator=(const list& lst); //等号运算符重载
- assign(int n , elem); //赋值n个elem
- swap(lst); //交换链表
person p1("孙悟空",199); lst1 = lst2; lst1.assign(5, p1); lst1.assign(lst2.begin(), lst2.end()); lst1.swap(lst2);
大小操作
- int size(); //判断容器中元素个数
- bool empty(); //判断list容器是否为空 为空返回true
- resize( int num );
//预留num个空间 比原来空间大则填充默认值0 自定义类型的所有属性都为0
// 比原来空间少则删除最后的元素
- resize( int num , elem ); //同上 默认填充值为elem
lst1.size(); lst1.empty(); lst1.resize(8); lst1.resize(8, p1);
插入和删除
//对两端进行操作
- void push_back(T); //将数据存入链表最后
- void push_front(T); //将数据存入链表最前
- void pop_back(); //将链表最后的数据删除
- void pop_front(); //将链表最前的数据删除
Li1.push_back(p1); Li1.push_front(p2); Li1.pop_back(); Li1.pop_front();
//对其它位置进行操作
- insert(pos , elem); //pos为迭代器 表示在pos位置插入元素elem
- insert(pos , begin , end); //三个参数都是迭代器 表示在pos处插入[begin,end)元素
- erase(begin , end); //删除[begin , end)元素
- erase( pos ); //删除pos处位置
- clear(); //清空容器数据
- remove( elem ); //删除于elem相等的数据
迭代器偏移操作:
list容器迭代器不支持随机访问 只能进行++或--
lst1.assign(4, p1); lst2.assign(4, p2); lst1.insert(lst1.begin()++, p3); lst1.insert(lst1.begin()++, lst2.begin(), lst2.end()); lst1.erase(lst1.begin()++, lst1.end()--); lst1.erase(lst1.begin()++); lst1.clear(); lst1.remove(p1);
数据存取
- front();
- back();
list迭代器不支持对数据的随机访问 只能访问头尾或对迭代器进行++ --操作
因为链表的数据存储不是连续的空间
对自定义类型进行读取
cout << lst1.front().m_name << " " << lst1.front().m_age << endl;; cout << lst1.back().m_name << " " << lst1.back().m_age << endl;;
反转和排序
- reverse(); 反转
- sort(); 排序
lst1.reverse(); sort(cmp); bool cmp(person a, person b) { //按年龄从大到小排序 return a.m_age > b.m_age; }