栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++】-- STL之list详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】-- STL之list详解

目录

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 //构造一个list,值为InputIterator的first到last之间的元素
  list (InputIterator first, InputIterator last,
         const allocator_type& alloc = allocator_type());
	list l1;//构造空链表
	l1.push_back(1);
	l1.push_back(2);
	l1.push_back(3);

	list l2(3,5);//构造一个元素为3个5的链表

	list l3(l1.begin(), l1.end());//构造l3,以l1起始区间到终止区间的内容为元素
	
    //使用a的元素作为迭代区间进行构造
	int a[] = { 3,6,9,12 };
	list 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::iterator it1 = l1.begin();
	while (it1 != l1.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;

	//链表不能使用[]进行元素访问,使用迭代器访问,打印l2
	list::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
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::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 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 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 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 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 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题很有用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/958122.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号