首页 > 代码库 > STL序列式容器之list

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.赋值操作符

// 定义链表容器l1list<string> l1(10, "HelloWorld");// 定义链表容器l2list<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.容器的插入元素

// 定义容器l2list<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.容器的删除元素

// 定义容器l2list<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