目录
list类
1.list类对象构造
2.迭代器
3.empty( )
4.size( )
5. front( )
6.back( )
7.push_front( )
8.pop_front( )
9.push_back( )
10.pop_back( )
11.insert( )
12.erase( )
13.swap( )
14.clear( )
15.remove( )
16.unique( )
17.sort( )
18.reverse( )
list类
list有如下特征:
(1)优点:可在任意位置插入删除元素,插入删除元素效率高
(2)底层是双向链表,因此list可以前后双向迭代,通过指针连接前后节点。forward_list是单链表,只能向前迭代
(3)缺点:不支持任意位置随机访问;需要额外空间保存前后节点信息
1.list类对象构造
explicit list (const allocator_type& alloc = allocator_type()); //构造空list
explicit list (size_type n, const value_type& val = value_type(),//构造一个有n个元素值为val的list
const allocator_type& alloc = allocator_type());
template <class InputIterator>//构造一个list,值为InputIterator的first到last之间的元素
list (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
list<int> l1;//构造空链表
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
list<int> l2(3,5);//构造一个元素为3个5的链表
list<int> l3(l1.begin(), l1.end());//构造l3,以l1起始区间到终止区间的内容为元素
//使用a的元素作为迭代区间进行构造
int a[] = { 3,6,9,12 };
list<int> l4(a, a+sizeof(a)/sizeof(a[0]));
2.迭代器
iterator begin();//正向迭代器,对迭代器++,迭代器向后移动
const_iterator begin() const;//正向const迭代器,对迭代器++,迭代器向前移动
reverse_iterator rbegin();//反向迭代器,对迭代器++,迭代器向后移动
const_reverse_iterator rbegin() const;//const反向const迭代器,对迭代器++,迭代器向前移动
//链表不能使用[]进行元素访问,使用迭代器访问,打印l1
list<int>::iterator it1 = l1.begin();
while (it1 != l1.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
//链表不能使用[]进行元素访问,使用迭代器访问,打印l2
list<int>::iterator it2 = l2.begin();
while (it2 != l2.end())
{
cout << *it2 << " ";
it2++;
}
cout << endl;
//范围for进行遍历,也是用迭代器实现的,打印l3
for (auto& e : l3)
{
cout << e << " ";
}
cout << endl;
for (auto& e : l4)
{
cout << e << " ";
}
cout << endl;
将打印抽象出来:
template<class Con>
void PrintContainer(const Con& con)
{
typename Con::const_iterator it = con.begin();
while(it != con.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
3.empty( )
bool empty() const;//判断链表是否为空,为空返回true,否则返回flase
cout << l4.empty() << endl;
4.size( )
size_type size() const;//求链表节点个数
5. front( )
返回第一个节点的引用
reference front();//返回第一个节点的引用
const_reference front() const;//返回第一个节点的const引用
cout << l4.front() << endl;
6.back( )
返回最后一个节点的引用
reference back();//返回最后一个节点的引用
const_reference back() const;//返回最后一个节点的const引用
cout << l4.back() << endl;
7.push_front( )
在第一个节点前插入节点
void push_front (const value_type& val);//在第一个元素前插入val
l4.push_front(10);//在l4第一个元素位置插入10
PrintContainer(l4);
8.pop_front( )
删除第一个节点
void pop_front();//删除第一个节点
l4.pop_front();//把l4的第一个节点删除
PrintContainer(l4);
9.push_back( )
在链表末尾插入节点
void push_back (const value_type& val);//在链表末尾插入val
l4.push_back(20);//在链表末尾插入20
PrintContainer(l4);
10.pop_back( )
删除链表末尾节点
void pop_back();//删除链表末尾节点
l4.pop_back();//删除l4末尾节点
PrintContainer(l4);
11.insert( )
在某一位置插入节点
iterator insert (iterator position, const value_type& val);//在某一位置插入值为val的节点
list<int>::iterator pos = find(l4.begin(), l4.end(), 6);//查找6的位置
l4.insert(pos, 100);//在6的位置插入100
PrintContainer(l4);
cout << *pos << endl;
迭代器没有失效:
12.erase( )
iterator erase (iterator position);//删除position位置的节点
pos已经是6的位置了,删除6之后,pos就失效了,变成了野指针,再对pos解引用就会报错
l4.erase(pos);
PrintContainer(l4);
cout << *pos << endl;
需要在erase进行删除后,对迭代器重新赋值,pos就不会是野指针了,代码应该改成这样:
l4.erase(pos);
pos = find(l4.begin(), l4.end(), 12);
PrintContainer(l4);
cout << *pos << endl;
13.swap( )
交换两个同类型list的内容
void swap (list& x);//交换两个同类型list的内容
l4.swap(l3);//交换l3和l4的内容
cout << "l3: ";
PrintContainer(l3);
cout << "l4: ";
PrintContainer(l4);
14.clear( )
清空list的内容
void clear();//清空list的内容
l4.clear();//清空l4的内容
PrintContainer(l4);
15.remove( )
删除链表中所有指定值的节点
void remove (const value_type& val);//删除链表中所有值为val的节点
list<int> l5;
l5.push_back(1);
l5.push_back(2);
l5.push_back(2);
l5.push_back(2);
l5.remove(2);//删除所有值为2的节点
PrintContainer(l5);
16.unique( )
去重,删除所有值相同的节点,只保留第一个
void unique();//每个节点的值只保留一个
list<int> l6;
l6.push_back(7);
l6.push_back(2);
l6.push_back(2);
l6.push_back(3);
l6.push_back(8);
l6.push_back(8);
l6.push_back(6);
l6.unique();//去重
PrintContainer(l6);
注意:但是unique( )只对连续相同值的节点去重,如果节点不连续,就算节点值相同也不会去重
假如l6插入的节点,相同值不连续,unique就去重不了 :
list<int> l6;
l6.push_back(7);
l6.push_back(8);
l6.push_back(2);
l6.push_back(3);
l6.push_back(2);
l6.push_back(8);
l6.push_back(6);
l6.unique();//去重,达不到目的,因为相同值不连续
PrintContainer(l6);
所以unique( )必须和排序sort( )结合起来才能去重
17.sort( )
对链表节点排序
void sort();//对链表节点排序
list<int> l6;
l6.push_back(7);
l6.push_back(8);
l6.push_back(2);
l6.push_back(3);
l6.push_back(2);
l6.push_back(8);
l6.push_back(6);
l6.sort();
PrintContainer(l6);
链表的排序基本没啥用,如果要排序,就存vector了
18.reverse( )
对链表进行逆置
void reverse();//逆置链表
list<int> l6;
l6.push_back(7);
l6.push_back(8);
l6.push_back(2);
l6.push_back(3);
l6.push_back(2);
l6.push_back(8);
l6.push_back(6);
l6.sort();
PrintContainer(l6);
链表的许多操作,对于做OJ题很有用