list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。 与vector相比, 它允许快速的插入和删除,但是随机访问却比较慢.
首先我们来看一下list都有哪些接口:
list中常用的函数
front() 返回第一个元素
back():返回最后一个元素
注意:list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。
begin():返回指向第一个元素的迭代器,通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator
end() 返回末尾的迭代器 ,可以调用list容器的 end() 函数来得到list末端下一位置。
pop_back():删除最后一个元素
pop_front():删除第一个元素
push_back():在list的末尾添加一个元素
push_front():在list的头部添加一个元素
void print_list(const list<int>& l)
{
list<int>::const_iterator it = l.begin();
while (it != l.end()) //end()相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用
{
cout << *it << " ";
++it;
}
cout << endl;
}
void test_list()
{
list<int> l;
//从头部向list中插入数据
l.push_front(3);
l.push_front(2);
l.push_front(1);
//从尾部向list中插入数据
l.push_back(4);
l.push_back(5);
l.push_back(6);
print_list(l);
//从头部删除数据
l.pop_front();
//从尾部删除数据
l.pop_back();
print_list(l);
//获取第一个元素和最后一个元素
cout << "第一个元素:" << l.front() << endl;
cout << "最后一个元素:" << l.back() << endl;
}
运行结果:
assign():给list赋值
void test_list()
{
list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
l1.push_back(5);
//将 l1中元素变为3个10。
l1.assign(3, 10);
print_list(l1);
list<int> l2;
l2.push_back(7);
l2.push_back(8);
l2.push_back(9);
l2.push_back(10);
//将l2中的从l2.begin()到l2.end()之间的数值赋值给l1
l1.assign(l2.begin(), l2.end());
print_list(l1);
}
clear():删除所有元素
empty():判断list是否为空,如果list是空的则返回true
erase(): 删除一个元素
//将l1的第一个元素删除。
l1.erase(l1.begin());
// 将l1的从begin()到end()之间的元素删除
l1.erase(l1.begin(), l1.end());
insert():插入一个元素到list中
//在l1的开始位置插入100。
l1.insert(l1.begin(), 100);
//在l1的开始位置插入2个100。
l1.insert(l1.begin(), 2, 100);
//在l1的开始位置插入l2的从开始到结束的所有位置的元素
l1.insert(l1.begin(), l2.begin(), l2.end());
max_size():返回list能容纳的最大元素大小
list<int> l1;
cout << l1.max_size() << endl;
merge():合并两个list
void test_list()
{
list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
print_list(l1);
list<int> l2;
l2.push_back(4);
l2.push_back(5);
l2.push_back(6);
l1.merge(l2);
print_list(l1);
print_list(l2);
}
remove():从list删除指定元素,如果该元素存在,则将list中的所有该元素删除,如果不存在,则不发生任何变化
list<int> l1;
l1.push_back(1);
l1.push_back(4);
l1.push_back(2);
l1.push_back(4);
l1.push_back(3);
l1.push_back(4);
print_list(l1);
l1.remove(4);
print_list(l1);
l1.remove(40);
print_list(l1);
resize():改变list的大小
reverse():把list的元素逆置
size():返回list中的元素个数
sort():给list排序
swap():交换两个list
unique():删除list中重复的元素
void test_list()
{
list<int> l1;
l1.push_back(3);
l1.push_back(1);
l1.push_back(2);
l1.push_back(4);
l1.push_back(4);
l1.push_back(2);
print_list(l1);
list<int> l2;
l2.push_back(4);
l2.push_back(5);
l2.push_back(6);
//将l1大小改为8
l1.resize(8);
cout << l1.size() << endl;
//逆置l1
l1.reverse();
print_list(l1);
//给l1排序
l1.sort();
print_list(l1);
//交换l1和l2
l1.swap(l2);
print_list(l1);
//删除l2中重复的元素
l2.unique();
print_list(l2);
}