STL序列式容器之list

Posted 王刚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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函数删除迭代器指向的元素后返回下一个迭代器。

 

以上是关于STL序列式容器之list的主要内容,如果未能解决你的问题,请参考以下文章

STL学习笔记--4序列式容器之list

STL之序列式容器list与forward_list

STL基础序列式容器之forward_list

STL学习笔记--4序列式容器之vector

一文带你认识STL序列式容器--list

STL源码剖析——序列式容器#2 List