zoukankan      html  css  js  c++  java
  • STL序列式容器之list

    一,list容器基本概念

    1.list容器基本知识

    • list容器的底部数据结构为双向链表,可以高效的进行插入和删除元素。
    • list因为底层数据结构是双向链表,因此不支持下标操作和.at()函数的操作。要获取元素,必须从头到尾遍历。
    • 使用list容器必须引入头文件# include<list>。

    二,list容器构造函数

    1.无参构造函数

    // 无参构造函数
    list<string> l1;

    2.有参构造函数

    // 有参构造函数,10个字符'A'来初始化容器
    list<char> l2(10, 'A');
    // 有参构造函数,用上面的容器初始化下面的容器
    list<char> l3(l2.begin(), l2.end());

    3.拷贝构造函数

    // 有参构造函数
    list<char> l1(10, 'A');
    // 拷贝构造函数
    list<char> l2 = l1;

    4.析构函数

      list的析构函数用来释放容器中元素所占用的内存。

    三,list容器的操作符重载

    1.赋值操作符

    // 定义链表容器l1
    list<string> l1(10, "HelloWorld");
    // 定义链表容器l2
    list<string> l2;
    // 赋值操作符重载
    l2 = l1;

    四,list容器的成员函数

    1.头部插入和删除元素

    // 定义容器
    list<string> l1;
    // 在容器头部添加元素
    l1.push_front("Hello");
    l1.push_front("World");
    l1.push_front("C++");
    // 移除容器头部元素
    l1.pop_front();

    2.尾部插入和删除元素

    // 定义容器
    list<string> l1;
    // 在容器尾部添加元素
    l1.push_back("Oracle");
    l1.push_back("IBM");
    l1.push_back("Microsoft");
    // 移除容器尾部元素
    l1.pop_back();

    3.容器的头部和尾部元素

    // 定义容器
    list<string> l1;
    // 在容器头部添加元素
    l1.push_front("Hello");
    l1.push_front("World");
    l1.push_front("C++");
    // 获取容器的头部和尾部元素
    string first = l1.front();
    string last = l1.back();

    4.容器的大小

    // 定义容器
    list<string> l1;
    // 在容器头部添加元素
    l1.push_front("Hello");
    l1.push_front("World");
    l1.push_front("C++");
    // 获取容器的大小
    int size = l1.size();

    5.容器的清空

    // 定义容器
    list<string> l1(10,"HelloWorld");
    // 容器的清空
    l1.clear();

    6.容器是否为空

    // 定义容器
    list<string> l1(10,"HelloWorld");
    // 容器是否为空
    bool isEmpty = l1.empty();

    7.容器的插入元素

    // 定义容器l2
    list<string> l2(5, "HelloWorld");
    // 在容器第二个位置插入"HelloC++",list只支持++和--,不支持具体的加几和减几,因为底层是链表
    l2.insert(++l2.begin(), "HelloC++");
    // 基于list容器的特征,经常配合迭代器来插入
    for (list<string>::iterator it = l2.begin(); it != l2.end(); it++)
    {
        l2.insert(it, "H");
    }

    8.容器的删除元素

    // 定义容器l2
    list<string> l2(5, "HelloWorld");
    // 删除容器的所有元素
    l2.erase(l2.begin(), l2.end());
    // 根据容器元素的值删除
    l2.remove("HelloC++");

    9.容器的遍历

    // 定义容器
    list<string> l2(10,"HelloWorld");
    // 增强for遍历
    for (string tmp : l2)
    {
        cout << tmp << " " ;
    }
    cout << endl;
    // 正向遍历
    for (list<string>::iterator it = l2.begin(); it != l2.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
    // 反向遍历
    for (list<string>::reverse_iterator it = l2.rbegin(); it != l2.rend(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    10.容器的反转

    // 定义容器
    list<string> l1;
    // 在容器头部添加元素
    l1.push_front("Hello");
    l1.push_front("World");
    l1.push_front("C++");
    // 容器的反转
    l1.reverse();

    11.list的遍历删除

    # include<iostream>
    # include<list>
    using namespace std;
    
    int main()
    {
        // 定义容器
        list<int> v;
        // 添加数据
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
        v.push_back(4);
        v.push_back(5);
        v.push_back(6);
        // 这里注意不需要++it
        for (list<int>::iterator it = v.begin(); it != v.end();)
        {
            // 删除偶数
            if (*it % 2 == 0)
            {
                // erase删除该元素后返回下一个元素的迭代器
                it = v.erase(it);
            }
            else {
                it++;
            }
        }
        // 遍历
        for (int tmp : v)
        {
            cout << tmp << " ";
        }
        cout << endl;
    
        return 0;
    }

    五,list容器注意事项

    1.存储自定义数据类型的注意

      要存储的自定义类型必须提供拷贝构造函数,因为容器是通过值的复制方式将元素存入到容器中的。

    2.list容器的访问

      list容器不支持随机存取元素,即不支持索引下标的方式访问和修改元素,要想访问元素必须通过迭代器进行遍历,遍历到要找到的位置。

    3.list容器的迭代器

    • list容器的迭代器不支持具体数据的加减,只支持++和--操作。
    • list的erase函数删除迭代器指向的元素后返回下一个迭代器。
  • 相关阅读:
    Java Object类及其常用方法
    Java 抽象类和抽象方法
    Java 多态
    Java 继承
    Java Scanner类
    正则表达_1
    「暑期集训day14」掠影
    「暑期集训day13」苦闷
    「暑期集训day12」苦楚
    「暑期集训day11」旧殤
  • 原文地址:https://www.cnblogs.com/metalsteel/p/6296949.html
Copyright © 2011-2022 走看看