1.list的介绍使用
- list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
- list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个素。
- 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
list的构造
list () 构造空的list
list (size_type,const value_type& val=value_type()) 构造的list中包含n个值为val的元素
list (const list& x) 拷贝构造函数
list (inputlterator first,inputlterator last) 用(first , last)区间中的元素构造list
int main()
{
list<int>l1; //构造空的l1
list<int>l2(4, 100); //l2中放置4个值为100 的元素
list<int>l3(l2.begin(), l2.end()); //用l2左闭右开的区间构造l3
list<int>l4(l3); //用l3构造l4
int array[] = { 1, 3, 4, 5 }; //以数组为迭代器区间构造l5
list<int>l5(array, array + sizeof(array) / sizeof(0));
//以迭代器方式打印l5中的元素
for (list<int>::iterator it = l5.begin(); it != l5.end(); it++)
{
cout << *it << "";
cout << endl;
}
//c++11范围for的方式遍历
for (auto& e : l5)
cout << e << "";
cout << endl;
system("pause");
return 0;
}
list iterator的使用
void print_list(const list<int>& l)
{
for (list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << "";
}
cout << endl;
}
int main()
{
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list<int>l(array, array + sizeof(array) / sizeof(array[0]));
//试用正向迭代器打印list中的元素
for (list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << "";
cout << endl;
}
//使用反向迭代器逆向打印list中的元素
for (list<int>::reverse_iterator it = l.rbegin(); it != l.rend(); it++)
{
cout << *it << "";
cout <<endl;
}
system("pause");
return 0;
}
list capacity
empty 检测list知否为空,是返回true,否返回false
size 返回list中有效节点的个数
list modifiers
push front 在list首元素前插入值为value的元素
pop front 删除list中的第一个元素
push back 在list尾部插入值为value的元素
pop back 删除list中的最后一个元素
insert 在list POS位置插入值为value的元素
erase 删除list POS位置的元素
swap 交换两个list中的元素
clear 清空list中的元素
void PrintList(list<int>& l)
{
for (auto& e : l)
cout << e << " ";
cout << endl;
}
// push_back/pop_back/push_front/pop_front
void TestList1()
{
int array[] = { 1, 2, 3 };
list<int> L(array, array + sizeof(array) / sizeof(array[0]));
// 在list的尾部插入4,头部插入0
L.push_back(4);
L.push_front(0);
PrintList(L);
// 删除list尾部节点和头部节点
L.pop_back();
L.pop_front();
PrintList(L);
}
// insert /erase
void TestList3()
{
int array1[] = { 1, 2, 3 };
list<int> L(array1, array1 + sizeof(array1) / sizeof(array1[0]));
// 获取链表中第二个节点
auto pos = ++L.begin();
cout << *pos << endl;
// 在pos前插入值为4的元素
L.insert(pos, 4);
PrintList(L);
// 在pos前插入5个值为5的元素
L.insert(pos, 5, 5);
PrintList(L);
// 在pos前插入[v.begin(), v.end)区间中的元素
vector<int> v{ 7, 8, 9 };
L.insert(pos, v.begin(), v.end());
PrintList(L);
// 删除pos位置上的元素
L.erase(pos);
PrintList(L);
// 删除list中[begin, end)区间中的元素,即删除list中的所有元素
L.erase(L.begin(), L.end());
PrintList(L);
}
// resize/swap/clear
void TestList4()
{
// 用数组来构造list
int array1[] = { 1, 2, 3 };
list<int> l1(array1, array1 + sizeof(array1) / sizeof(array1[0]));
PrintList(l1);
// 交换l1和l2中的元素
l1.swap(l2);
PrintList(l1);
PrintList(l2);
// 将l2中的元素清空
l2.clear();
cout << l2.size() << endl;
}
list迭代器失效问题
迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。