STL中list常用操作

1、什么是list容器

  • list是一个双向链表容器,可以在任意位置快速插入或删除元素,但是随机访问元素的速度较慢。
  • list不可以随机访问,只能通过迭代器访问。所以不支持.at()和[]操作符。
it++ //right;
it + 5; //error

2、头部和尾部操作

    //获取链表第一个结点
    int x = l1.front();
  
    x = l1.front();

    //获取链表最后一个结点
    x = l1.back();

    //将第一个结点的值改为10
    l1.front() = 10;

3、list与迭代器

list的迭代器是双向迭代器,不支持随机访问,只能通过++或--来移动迭代器。

正向迭代器:

//正向迭代器例子:
    list<int> l1 = {1, 2, 3, 4, 5};
    list<int>::iterator it = l1.begin();
    while (it != l1.end()) {
        cout << *it << " ";
        it++;
    }

反向迭代器:

    //反向迭代器例子:
    list<int> l1 = {1, 2, 3, 4, 5};
    list<int>::reverse_iterator rit = l1.rbegin();
    while (rit != l1.rend()) 
    {
        cout << *rit << " ";
        rit++;
    }

4、list带参数构造

list(n,elem) //构造函数,创建n个值为elem的元素
list(begin, end); //构造函数,使用区间[begin, end)的元素构造list
list(const list &lst); //拷贝构造函数

注意:list(begin, end) 不支持迭代器 + n的操作

  list<int> l2(l1.begin()+ 1, l2.end()); //error
//list(begin, end)
int main()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);

    list<int>::iterator beg = l1.begin();
    list<int>::iterator end = l1.begin();

    beg++;  
    end++;
    end++;
    end++;
    
    list<int> l2(beg, end);     //此处为左闭右开区间
    list<int>::iterator it2;
    for(it2 = l2.begin(); it2 != l2.end(); it2++)
    {
        cout << *it2 << " ";
    }
    cout << endl;
    return 0;
}

list<int> l1(5, 10); //创建5个值为10的元素
list<int> l2(l1.begin(), l1.end()); //使用l1的元素构造l2
list<int> l3(l2); //使用l2构造l3

5、list赋值

list.assign(beg, end); //将[begin, end)区间中的元素赋值给list
list.assign(n, elem); //将n个elem的元素赋值给list
list &operator=(const list &lst); //重载等号操作符
list.swap(lst); //将lst与当前的list交换

list<int> l1;
    list<int>::iterator it;
    l1.assign(3, 10); //将l1中的元素初始化为10个3

    list<int> l2;
    l2.assign(l1.begin(), l1.end()); //将l1中的元素赋值给l2
    list<int>::iterator it2 = l1.end();
    it2--;
    for(it = l1.begin(); it != it2; it++)
    {
        cout << *it << " ";
    }

    l1.assign(4,1);     //assign函数不是追加,而是重新赋值

    l1.swap(l2); //交换l1和l2的元素

6、list大小操作

list.size(); //返回list中元素的个数
list.empty(); //判断list是否为空
list.resize(num); //重新指定list的大小,如果num大于当前list的大小,则插入默认值;如果num小于当前list的大小,则删除后面的元素
list.resize(num, elem); //重新指定list的大小,并填充默认值
,如果num大于当前list的大小,则插入elem;如果num小于当前list的大小,则删除后面的元素

int main()
{
    list<int> l1;
    list<int>::iterator it;
    l1.assign(3, 10);
    int len = l1.size();
    for(it = l1.begin(); it != l1.end(); it++)
        cout << *it << " ";     //10 10 10
    l1.resize(5);       

    for(it = l1.begin(); it != l1.end(); it++)
        cout << *it << " ";     //10 10 10 0 0
    return 0;
}

7、list的插入

插入不会使list的迭代器失效。

list.insert(pos, elem); //在pos位置插入elem元素,返回新元素的迭代器
list.insert(pos, n, elem); //在pos位置插入n个elem元素
list.insert(pos, beg, end); //在pos位置插入[beg, end)区间的元素

8、list的删除

删除可能会使list的迭代器失效。

list.pop_front(); //删除第一个元素
list.pop_back(); //删除最后一个元素
list.erase(pos); //删除pos位置的元素,返回下一个元素的迭代器
list.erase(beg, end); //删除[beg, end)区间的元素,返回下一个元素的迭代器
list.remove(elem); //删除所有与elem值匹配的元素
list.clear(); //删除所有元素

int main()
{
    list<int> l1;
    list<int>::iterator it = l1.begin();
    
    l1.push_back(1);
    l1.push_back(25);
    l1.push_back(39);
    l1.push_back(47);

    list<int>::iterator it1 = l1.begin();
    

    for(it = l1.begin(); it != l1.end(); it++)
    {
        cout<< *it << " ";
    }
    cout << endl;

    it  = l1.erase(it1);        
    //删除单一元素,返回的是被删除元素的下一个元素的迭代器
    cout << *it << endl;            // 25 
}
//删除某一区间的元素
    list<int>::iterator it1 = l1.begin();
    list<int>::iterator it2 = l1.begin();
    it2++;
    it2++;
    l1.erase(it1, it2);     //删除第一个和第二个元素

    for(it = l1.begin(); it != l1.end(); it++)
    {
        cout<< *it << " ";
    }
//删除所有的30
int main()
{
    list<int> l1;
    list<int>::iterator it = l1.begin();
    
    l1.push_back(30);
    l1.push_back(25);
    l1.push_back(30);
    l1.push_back(30);
    l1.push_back(47);
    l1.push_back(30);

    for(it = l1.begin(); it != l1.end(); it++)
    {
        cout<< *it << " ";
    }
    cout << endl;

    l1.remove(30);          //删除所有的30

    for(it = l1.begin(); it != l1.end(); it++)
    {
        cout<< *it << " ";
    }
    
    return 0;
}

9、list的排序

list.sort(); //对list中的元素进行排序
list.reverse(); //反转链表
list.unique(); //删除相邻重复的元素,只保留一个。


//unique()
int main()
{
    list<int> l1;
    list<int>::iterator it = l1.begin();
    
    l1.push_back(30);
    l1.push_back(30);
    l1.push_back(25);
    l1.push_back(30);
    l1.push_back(30);
    l1.push_back(30);
    l1.push_back(47);
    l1.push_back(30);

    for(it = l1.begin(); it != l1.end(); it++)
    {
        cout<< *it << " ";          // 30 30   25   30 30 30   47 30
    }
    cout << endl;

    l1.unique();

    for(it = l1.begin(); it != l1.end(); it++)
    {
        cout<< *it << " ";         //30    25    30   47 30
    }
}

10、list迭代器失效

在删除元素时,迭代器会失效,不能继续使用,否则会报错。

int main()
{
    list<int> l1;
    list<int>::iterator it = l1.begin();
    
    l1.push_back(30);
    l1.push_back(30);
    l1.push_back(25);
    l1.push_back(30);
    l1.push_back(30);
    l1.push_back(30);
    l1.push_back(47);
    l1.push_back(30);
    l1.push_back(30);


    //迭代器失效的情况
    for (it = l1.begin(); it != l1.end();)
    {
        if(*it == 30)
        {
            l1.erase(it);           //正确做法:it = l1.erase(it); 删除元素后,使it指向下一个元素
        }

        else
        {
            it++;
        }
    }

    for(it = l1.begin(); it != l1.end(); it++)
    {
        cout << *it << " ";
    }
}
posted @ 2024-12-28 17:48  baobaobashi  阅读(8)  评论(0编辑  收藏  举报