- 由于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
- 单链表,只需要正向迭代器。