【STL】C++ list 基本使用

目录

[一 list 常见构造](#一 list 常见构造)

[1 空容器构造函数(默认构造函数)](#1 空容器构造函数(默认构造函数))

[2 Fill 构造函数](#2 Fill 构造函数)

[3 Range 构造函数](#3 Range 构造函数)

[4 拷贝构造函数](#4 拷贝构造函数)

[二 list迭代器](#二 list迭代器)

[1 begin && end](#1 begin && end)

[2 rbegin && rend](#2 rbegin && rend)

[三 list 容量操作](#三 list 容量操作)

[四 list 修改操作](#四 list 修改操作)

[1 assign](#1 assign)

[2 push_front && pop_back](#2 push_front && pop_back)

[3 push_back && pop_back](#3 push_back && pop_back)

[4 insert](#4 insert)

[5 erase](#5 erase)

[6 swap](#6 swap)

[7. resize](#7. resize)

[8 clear](#8 clear)

[9 关于 emplace系列操作说明](#9 关于 emplace系列操作说明)

[五 list 元素访问](#五 list 元素访问)

[六 其他操作](#六 其他操作)

[1 splice](#1 splice)

[2 remove](#2 remove)

[3 unique](#3 unique)

[4 sort](#4 sort)

[5 reverse](#5 reverse)

[七 总结](#七 总结)


一 list 常见构造

1 空容器构造函数(默认构造函数)

构造一个没有元素的容器。

2 Fill 构造函数

构造一个包含 n 个元素的容器。每个元素都是 val 的副本。

3 Range 构造函数

构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都按相同的顺序从该范围中的相应元素构造而成。

4 拷贝构造函数

构造一个容器,其中包含 x 中每个元素的副本,顺序相同。

cpp 复制代码
#include<iostream>
#include<list>
using namespace std;

void Print(list<int>& lt)
{
	list<int>:: iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

int main()
{
	list<int> a;

	list<int> b(4, 100);
	list<int> c(4);
	list<int> d(b.begin(), b.end());
	list<int> e(b);

	cout << "b: ";
	Print(b);

	cout << "c: ";
	Print(c);

	cout << "d: ";
	Print(d);

	cout << "e: ";
	Print(e);

	return 0;
}

C++11构造

cpp 复制代码
void Print(list<int>& lt)
{
	list<int>:: iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}


int main()
{
	list<int> lt1{ 1, 2, 3, 4, 5 };
	Print(lt1);
	return 0;
}

二 list迭代器

list模式和vector如出一辙

注意:

ist的迭代器是支持++--操作的(前后缀都支持)

但是不支持+-操作,因为链表不能进行随机访问操作,只能O(n)查询

1 begin && end

cpp 复制代码
iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
cpp 复制代码
void Test3()
{
    list<int> lt(4, 1);
    list<int>::iterator it = lt.begin();
    while (it != lt.end())
    {
        cout << *it << ' ';
        ++it;
    }
    cout << endl;

    const list<int> llt(4, 10);
    list<int>::const_iterator itt = llt.begin();
    while (itt != llt.end())
    {
        cout << *itt << ' ';
        ++itt;
    }

}

2 rbegin && rend

cpp 复制代码
reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
cpp 复制代码
void Test4()
{
    list<int> lt(5);
    list<int>::reverse_iterator it = lt.rbegin();
    int i = 1;
    while (it != lt.rend())
    {
        *it += i;
        ++it;
        ++i;
    }
    for (auto e : lt)
    {
        cout << e << ' ';
    }

}

三 list 容量操作

这里直接代码演示

cpp 复制代码
void Test5()
{
    list<int> lt1;
    if (lt1.empty()) cout << "empty" << endl;
    else cout << "full" << endl;

    list<int> lt2{ 1, 2, 3, 4 };
    cout << "lt1: " << lt1.size() << "  lt2: " << lt2.size() << endl;
}

四 list 修改操作

1 assign

将新内容分配给 list 容器,替换其当前内容,并相应地修改其大小。

cpp 复制代码
range (1)	
template <class InputIterator>  void assign (InputIterator first, InputIterator last);
fill (2)	
void assign (size_type n, const value_type& val);
cpp 复制代码
void Test6()
{
    std::list<int> first;
    std::list<int> second;

    first.assign(7, 100);                      

    second.assign(first.begin(), first.end()); 

    int myints[] = {1776,7,4 };
    first.assign(myints, myints + 3);            

    cout << "first: ";
    for (auto e : first)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "second: ";
    for (auto e : second)
    {
        cout << e << " ";
    }
    cout << endl;
}

2 push_front && pop_back

cpp 复制代码
void push_front (const value_type& val);
void pop_front();
cpp 复制代码
void Test7()
{
    list<int> lt = { 1, 2 };
    lt.push_front(100);
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;

    lt.pop_front();
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;
}

3 push_back && pop_back

cpp 复制代码
void push_back (const value_type& val);
void pop_back();
cpp 复制代码
void Test8()
{
    list<int> lt = { 1, 2 };
    lt.push_back(100);
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;

    lt.pop_back();
    for (auto e : lt)
    {
        cout << e << " ";
    }
    cout << endl;
}

4 insert

指定位置的元素之前插入新元素来扩展容器,从而有效地通过插入的元素数增加容器大小

cpp 复制代码
single element (1)	
iterator insert (iterator position, const value_type& val);

fill (2)	
    void insert (iterator position, size_type n, const value_type& val);

range (3)	
template <class InputIterator>    void insert (iterator position, InputIterator first, InputIterator last);
cpp 复制代码
void Test9()
{
   
    list<int> lt(4, 10);
    lt.insert(lt.begin(), 100);
    for (auto e : lt)
    {
        cout << e << ' ';
    }
    cout << endl;

    lt.insert(lt.end(), 4, 100);
    for (auto e : lt)
    {
        cout << e << ' ';
    }

    cout << endl;
    
}

5 erase

从容器中删除单个元素 (position) 或一系列元素 ( [first,last))

cpp 复制代码
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
cpp 复制代码
void Test10()
{
    list<int> lt{ 1, 2, 3, 4, 5, 6};
    lt.erase(lt.begin());
    for (auto e : lt)
    {
        cout << e << ' ';
    }

    cout << endl;

    lt.erase(++lt.begin(), lt.end());
    for (auto e : lt)
    {
        cout << e << ' ';
    }
}

6 swap

通过 x 的内容交换容器的内容,x 是另一个相同类型的容器对象。size可能有所不同。

cpp 复制代码
void swap (list& x);
cpp 复制代码
void Test11()
{
    
    list<int> l1(4, 10);
    list<int> l2(4, 1);
    l1.swap(l2);

    cout << "l1: ";
    for (auto e : l1)
    {
        cout << e << ' ';
    }
    cout << endl;

    cout << "l2: ";
    for (auto e : l2)
    {
        cout << e << ' ';
    }  
}

7. resize

调整容器的大小,使其包含 n 个元素。

cpp 复制代码
void resize (size_type n);
void resize (size_type n, const value_type& val);

如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出(并销毁它们)的元素。

如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。

如果指定了 val ,则新元素将初始化为 val 的副本,否则,它们将进行值初始化(0)。

cpp 复制代码
void Test12()
{
    list<int> mylist;
    for (int i = 1; i < 10; ++i) mylist.push_back(i);

    mylist.resize(5);
    cout << "mylist contains:";
    for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
    cout << endl;

    mylist.resize(8, 100);
    cout << "mylist contains:";
    for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
    cout << endl;

    mylist.resize(12);
    cout << "mylist contains:";
    for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)
        std::cout << ' ' << *it;
    cout << endl;

}

8 clear

从容器中删除所有元素(这些元素被销毁),使容器的大小为0。

cpp 复制代码
void clear() noexcept;
cpp 复制代码
void Test13()
{
    list<int> lt(1, 4);


    lt.clear();
    cout << lt.size() << endl;

    for (auto e : lt)
    {
        cout << e << ' ';
    }
    cout << endl;
}

9 关于 emplace系列操作说明

这个系列的操作放在 右值引用讲解完之后再讲, 这样才能更好的理解. 大家不需要着急的, 因为 上面讲的完全够用, 而且emplace 是优化, 并不是其他功能

五 list 元素访问

cpp 复制代码
void Test13()
{
    list<int> lt{ 1, 2, 3, 4 };

    cout << lt.front() << endl;
    cout << lt.back() << endl;
}

六 其他操作

1 splice

将元素从一个列表转移到另一个列表

cpp 复制代码
void splice(iterator position, list& x);
将 x 的所有元素转移到容器中
  
void splice(iterator position, list& x, iterator i);
仅将 i 指向的元素从 x 传输到容器中

void splice(iterator position, list& x, iterator first, iterator last);
将范围 [first,last) 从 x 传输到容器中。
cpp 复制代码
void Test14()
{
    list<int> mylist1 = { 1, 2, 3, 4 }, mylist2 = { 10, 20, 30 };
    list<int>::iterator it = mylist1.begin();
    ++it;         // points to 2

    mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4

    cout << "mylist1:  ";
    for (auto e : mylist1)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "mylist2:  ";
    for (auto e : mylist2)
    {
        cout << e << " ";
    }
    cout << endl;

    mylist2.splice(mylist2.begin(), mylist1, mylist1.begin());
    cout << "mylist1:  ";
    for (auto e : mylist1)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "mylist2:  ";
    for (auto e : mylist2)
    {
        cout << e << " ";
    }
    cout << endl;


    mylist1.splice(mylist1.begin(), mylist2, mylist2.begin(), mylist2.end());
    cout << "mylist1:  ";
    for (auto e : mylist1)
    {
        cout << e << " ";
    }
    cout << endl;

    cout << "mylist2:  ";
    for (auto e : mylist2)
    {
        cout << e << " ";
    }
    cout << endl;
}

2 remove

从容器中删除所有与 val 相等的元素。这将调用这些对象的析构函数,并通过删除的元素数来减小容器大小

cpp 复制代码
vvoid remove (const value_type& val);
cpp 复制代码
int main()
{
       list<int> lt;
       lt.push_back(1);
       lt.push_back(2);
       lt.push_back(2);
       lt.push_back(4);
       lt.push_back(5);
       cout << lt.size() << endl;

       lt.remove(2);

       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;
       cout << lt.size() << endl;
       return 0;
}

3 unique

从容器中每个连续的相等元素组中删除除第一个元素之外的所有元素。请注意,只有当某个元素与其前面的元素相等时,该元素才会从列表容器中删除。因此,此函数对于排序列表特别有用。

cpp 复制代码
void unique();
cpp 复制代码
int main()
{
       list<int> lt;
       lt.push_back(1);
       lt.push_back(1);
       lt.push_back(2);
       lt.push_back(4);
       lt.push_back(2);
       lt.push_back(2);
       lt.push_back(4);
       lt.push_back(3);

       lt.push_back(5);

       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;

       lt.sort();//需要先排序
       lt.unique();
       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;

       return 0;
}

4 sort

对容器中的元素进行排序

对列表 中的元素进行排序,改变它们在容器中的位置。

cpp 复制代码
void sort();
cpp 复制代码
void Test15()
{
    list<int> lt{ 2, 1, 2, 4, 10, 11, 99, 88 };
    lt.sort();
    for (auto e : lt)
    {
        cout << e << " ";
    }

}

5 reverse

反转列表容器 中元素的顺序

cpp 复制代码
void reverse()void reverse()
cpp 复制代码
int main()
{
       list<int> lt;
       lt.push_back(1);
       lt.push_back(2);
       lt.push_back(3);
       lt.push_back(4);
       lt.push_back(5);
       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;
       lt.reverse();

       for (auto e : lt)
       {
              cout << e << " ";
       }
       cout << endl;
       return 0;
}

七 总结

list终于抽时间写完了, 首先本节大多数代码实验, 理论讲解少, 还是那句话, 如果对概念不清楚, 请到 string看, 或者翻阅文档, 这些都是最基本的素养. list 很多操作和 vector一样的, 但也有差别, 注意区分即可.

今天去中医看病, 医生说 眼睛就是你的肾, 舌头是你的心脏, 大家一定注意饮食规律, 不要久坐啊.

相关推荐
森龙安23 分钟前
指针 || 引用 || const || 智能指针 || 动态内存
c++
**K34 分钟前
C++ 智能指针使用不当导致内存泄漏问题
开发语言·c++·算法
湫兮之风1 小时前
C++:.front()函数作用
开发语言·c++
小老鼠不吃猫1 小时前
力学笃行(四)Qt 线程与信号槽
c++·qt·信息可视化
小羊子说1 小时前
Android 开发中 C++ 和Java 日志调试
android·java·c++
TechQuester1 小时前
解决GPT-4o耗电难题!DeepMind新算法训练效率提升13倍,能耗降低10倍!
java·c++·人工智能·python·算法·chatgpt
观鉴词recommend1 小时前
【c++刷题笔记-动态规划】day32: 509. 斐波那契数 、 70. 爬楼梯 、 746. 使用最小花费爬楼梯
c++·笔记·算法·leetcode·动态规划
DieSnowK1 小时前
[C++][ProtoBuf][初识ProtoBuf]详细讲解
开发语言·c++·google·协议·序列化·反序列化·protobuf
酷酷学!!!2 小时前
C++第一弹 -- C++基础语法上(命名空间 输入输出 缺省参数 函数重载 引用)
开发语言·c++·学习方法·visual studio
郝YH是人间理想2 小时前
《算法笔记》总结No.3——排序
c语言·数据结构·c++·算法·排序算法·csp