list的常见使用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41033913/article/details/84633479

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() 进行排序,可以自行传参,但是比较麻烦

猜你喜欢

转载自blog.csdn.net/qq_41033913/article/details/84633479