c++中的链表list容器

64 篇文章 0 订阅
  • 由于list是一个双向链表,所以迭代器必须具备前移、后移的能力,它使用双向迭代器,不支持随机迭代器。
  • 随机迭代器和双向迭代器都支持“++”
  • 双向迭代器只支持“++”。
  • 随机迭代器支持“++”和“+n”
  • 插入和删除不会造成原有的list迭代器失效,而vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。

基本函数

list构造函数
list<T>lstT;//list采用采用模板类实现,对象的默认构造形式:
list(beg ,end) ;//构造函数将[beg, end)区间中的元索拷贝给本身。
list(n,elem) ;//构造函数将n个elem拷贝给木身。
list(const list &lst);//拷贝构造随数。

list数据元素插入和删除操作
push_back(elem) ;//在容器尾部加入-一个元素
pop_back();//删除容 器中最后一个 元素
push_front(elem);//在容器开头插入一个元素
pop_front();//从容器开头移除第一 - 个元素
insert(pos,elem) ; //在pos位置插elem元素的拷贝,返四新数据的位置。
insert(pos,n,elem);//在pos位置捕入n个elem数据,无返回值。
insert(pos,beg,end) ;//在pos位置插入[beg, end)区间的数据,无返回值。
splice(v1.begin(), v2);//将v1插入到v2后面,v1清空。
v.unique();将相邻的相同值压缩为一个值。
clear() ;//移除容器的所有数据
erase(beg,end) ;//删除[beg,end)区间的数据,返回下一一个数据的位置。
erase(pos) ;//删除pos位置的数据,返回下一一个数据的位置。
remove(e1em);//删除容器1所布与elem值匹配的元索。

list大小操作
size();//返回容器中元素的个数
empty();//判断容器足否为空
resize(num);// T新指定帘器的长安为num,
若容器变长,则以默认值填充新位置、
如果容器变短,则末尾超出容器长度的元素被删除。
resize(num,elem);// 重新指定容器的长度为num,
若容器变长,则以elem值填充新位置。
如果容器变短,则末尾超出容器长度的元素被刚除。

list赋值操作
assign(beg,end);//将[beg, end)/区间中的数据拷 贝赋仿给本身.
assign(n,elem);//将n个elem拷贝赋值给本身。
list& operator=(const list &lst);//重载等号操作符
swap(lst);N将lst_与本身的元有互换。

list数据的存取
front();//返网第一个元素。
back();//返问最后一个元肃。

list 反转排序
reverse();//反转链表,
//比如lst包含1,3,5元素,运行此方法后,lst 就包含5,3,1元素,
sort(); //list 挑序
  • 注意:函数sort(v.begin(), v.end());仅支持随机访问迭代器(不支持list)
  • 而list有自己的排序函数:sort();
L.push_back(20) ;
L.push_back(30) ;
L.push_back(40) ;
printListInt(L) ;//10 20 30 40
//迭代器+n 只有随机访 问迭代器支持
//而list容 器的迭代器是双向达代器不支持+n
//L.insert(L.begin()+2, 3,100) ;/ /err
list<int>::iterator it = L.begin( ) ;
//++ 随机访问迭代器以及双向迭代器都支持
it++ ;
it++;
L.insert(it,3,100) ;
printListInt(L) ;//10 20 100 100 100 30 40
  • 例子:
//链表反转 
L.reverse() ;
printListInt(L) ;//40 30 20 10
//sort是系统提供的算法仅支持随机访问迭代器(不支持list)
//List容 器不能使用系统算法list会白已提供算法
//sort(L.begin() ,L.end()) ;
L.sort() ;
printListInt(L) ;//10 20 30 40

删除自定义数据

  • 必须重载“==”运算符
//成员函数重载==运算符
bool operator==(const Person &ob )
{
	if(this->name == ob.name && this->age == ob. age)
		return true ;
	return false ;
}

void printL istPerson(list<Person> &L)
{
	cout<<"-----------"
	for(list<Person>::iterator it=L.begin();=L.end() ;it++)
	{
		cout<<(*it) .name<<" "<<(*it).age<<endl ;
	}
}

//删除狗头
Person tmp("狗头" ,18) ;
//重载==运算符
L.remove (tmp) ;
printListPerson(L) ;

对自定义数据排序

  • 重载“<”,可以根据报错中的提示重载相应的运算符。
  • 也可以自己定义函数。
/ /成员函数重载<运算符
bool operator<(const Person &ob )
{
	return this->age < ob.age ;
}

自己编写排序方法

自己定义一个函数告诉sort()怎么排。

bool myCompasePerson(const Person &ob1, const Person &ob2)
{
	return ob1.age < ob2.age;
}
void test03()
{
	//存放白定义数据
	list<Person> L;
	L. push_back(Person(" 德玛西业." ,48));
	L. push_back(Person("提英"28));
	L. push_back(Person("狗头"18));
	L. push_back(Person("牛头"19));
	printListPerson(L);
	//对于自定义数据我们可以重载<运算符
	L.sort (myComparePerson) ;
}

forward_list

  • 单链表,只需要正向迭代器。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值