list的常见使用方法
程序员文章站
2022-07-14 20:25:26
...
list的常见的使用方法
list因为是链表模板,所以不用多想会比其他的stl复杂一些,在总结的时候也几度崩溃,因为很多操作在其他stl可以直接使用的操作在list里面都会报错,我尽量会用比较易懂的代码进行实现。
list是双链表类模板,常规操作是遍历、查找、增加、删除等,文章主要根据这四个进行说明。
遍历
- 这里的遍历需要用到迭代器,之前说过比较麻烦,但是真的还是比较简单,也不觉得麻烦了。
- 首先得创建 list::iterator it;
for(it = l.begin();it!=l.end();it++){
cout<<*it<<" ";
}
查找
其操作可以在遍历的时候进行比较就可以了
for(it = l.begin();it!=l.end();it++){
if(*it == fin){
cout<<"yes"<<endl;
break;
}
}
删除
可以用到l.remove()、l.remove_if()、l.earse();
- l.remove():传入的参数是你想删除的值,例如你想删除5这个值或者字符串什么的,直接传参5或者字符串就好,不是删除第五个数
- l.remove_if():这个对删除操作有限制的,例如想删除2的倍数等,参数是一个函数,但是很不好写,而且我在操作中直接想的用法是在l.remove的时候进行if的判断, 如果想进行这个操作,我贴出函数的模板吧。
template <class T> class is_odd : public std::unary_function<T, bool>
{
public:
bool operator( ) ( T& val )
{
return ( val % 2 ) == 1;
//模2的用法,返回的是一个bool值,类似于我们写sort时那个cmp
}
};
//调用:l.remove_if( is_odd<int>( ) );
如果是用if语句进行条件删除(循环操作删除元素)
#include<iostream>
#include<list>
using namespace std;
int main(){
list<int> l;
int n = 10;
for(int i=0;i<n;i++)
l.push_back(i+100);
list<int>::iterator it = l.begin();
list<int>::iterator it2 = l.begin();
//删除操作
for(it=l.begin();it!=l.end();it++){
if((*it)%2==0){
it2 = it;
it++;
if(it2==l.end())
l.pop_back();
else
l.remove(*it2);
// it++;
}
}
for(it = l.begin();it!=l.end();it++)
cout<<*it<<" ";
return 0;
}
我调了很久才调处来,结果出现自己都很惊讶,而且还有一个小问题就是,那个判断语句中间的那个it++只能写在删除操作的前面,写在后面不可以,而且不删掉也没什么影响,有点接受不了!然后那个remove(it2),也可以用erase(it2)实现
- l.earse():只能通过迭代器来进行删除,如果想删除第3个元素,不能直接用l.begin()+3,因为C++类没有这个操作,只能自加或者自减,如果想那样实现的话,需要自己去写;
- 或者用advance(it,pos);实现,意思是,将迭代器前移pos为,到你想删除的位置,然后进行删除的操作
it = l.begin();
l.erase();
//删除第一个元素
it = l.begin();
advance(it,pos);
l.erase(it);
//删除第pos+1位置处的元素,因为从0开始
在写验证代码的时候发现了remove和erase的一点点区别,我会再整理一下,争取加深理解;
增加
需要用到的是insert();传入的参数可以有多个,如果想加深了解可以找找,我这儿只说下基本怎么去使用
list<int>::iterator it;
it = l.begin();
advance(it,pos);
//在pos+1的位置插入ele元素
l.insert(it,ele);
//在pos+1的位置插入n个ele元素
l.insert(it,n,ele);
//在pos+1的位置插入[ele1,ele2)的元素
l.insert(it,ele1,ele2)
还有一些用得比较多的成员函数:
名字 | 意思 |
---|---|
empty() | 判断list是否为空 |
size() | 判断list的大小 |
push_back() | 从最后插入元素 |
pop_back() | 从最后删除元素 |
unique() | 删除相邻的重复元素 |
sort() | 进行排序,可以自行传参,但是比较麻烦 |
上一篇: 我的Java SE总结(二)
下一篇: centos创建用户并配置sudo权限