c++ STL之list对结构体的增加,删除,排序等操作详解

C++ STL之list对结构体的增加, 删除, 排序等操作详解

一、前言

C++ STL (Standard Template Library)是C++的标准库之一,其中包括list容器。list容器是一个双向链表的实现,可以用来存储各种数据类型,包括结构体。本攻略将详细说明如何在list容器中对结构体进行增加、删除、排序等操作。

二、基础知识

在使用list容器之前,需要包含头文件"list"。在定义list容器时,需要指定存储的数据类型,例如:

#include <list>
#include <string>

std::list<std::string> strList; // 定义存储字符串的list容器

需要注意的是,在定义存储结构体的list容器时,需要定义结构体类型,并根据需要进行重载比较运算符("<",">"等)。例如:

#include <list>

struct Person {
    std::string name;
    int age;
};

bool operator<(const Person& p1, const Person& p2) // 重载小于运算符
{
    return p1.age < p2.age;
}

std::list<Person> personList; // 定义存储Person结构体的list容器

三、增加操作

1. 前、后插入元素

使用list容器的push_front和push_back函数,可以在list容器的前面和后面插入数据。例如:

#include <list>
#include <iostream>
#include <string>

struct Person {
    std::string name;
    int age;
};

bool operator<(const Person& p1, const Person& p2)
{
    return p1.age < p2.age;
}

int main()
{
    std::list<Person> personList; // 定义存储Person结构体的list容器

    Person p1 = {"Tom", 20}; // 定义第一个Person结构体
    personList.push_back(p1); // 在List容器尾部添加第一个Person结构体

    Person p2 = {"Jerry", 18}; // 定义第二个Person结构体
    personList.push_front(p2); // 在List容器头部添加第二个Person结构体

    // 遍历输出list容器中的数据
    for (auto iter = personList.begin(); iter != personList.end(); iter++) {
        std::cout << iter->name << " " << iter->age << std::endl;
    }
    return 0;
}

输出结果为:

Jerry 18
Tom 20

2. 利用迭代器插入元素

使用list容器的insert函数,可以在指定位置插入数据。例如:

#include <list>
#include <iostream>
#include <string>

struct Person {
    std::string name;
    int age;
};

bool operator<(const Person& p1, const Person& p2)
{
    return p1.age < p2.age;
}

int main()
{
    std::list<Person> personList; // 定义存储Person结构体的list容器

    Person p1 = {"Tom", 20}; // 定义第一个Person结构体
    personList.push_back(p1); // 在List容器尾部添加第一个Person结构体

    Person p2 = {"Jerry", 18}; // 定义第二个Person结构体
    auto iter = personList.insert(personList.begin(), p2); // 在List容器头部添加第二个Person结构体

    Person p3 = {"John", 25}; // 定义第三个Person结构体
    personList.insert(iter, p3); // 在第二个Person结构体之前添加第三个Person结构体

    // 遍历输出list容器中的数据
    for (auto iter = personList.begin(); iter != personList.end(); iter++) {
        std::cout << iter->name << " " << iter->age << std::endl;
    }
    return 0;
}

输出结果为:

Jerry 18
John 25
Tom 20

四、删除操作

使用list容器的erase函数,可以删除指定位置的数据。例如:

#include <list>
#include <iostream>
#include <string>

struct Person {
    std::string name;
    int age;
};

bool operator<(const Person& p1, const Person& p2)
{
    return p1.age < p2.age;
}

int main()
{
    std::list<Person> personList; // 定义存储Person结构体的list容器

    Person p1 = {"Tom", 20}; // 定义第一个Person结构体
    personList.push_back(p1); // 在List容器尾部添加第一个Person结构体

    Person p2 = {"Jerry", 18}; // 定义第二个Person结构体
    auto iter = personList.insert(personList.begin(), p2); // 在List容器头部添加第二个Person结构体

    Person p3 = {"John", 25}; // 定义第三个Person结构体
    personList.insert(iter, p3); // 在第二个Person结构体之前添加第三个Person结构体

    auto iter2 = personList.begin();
    iter2++; // 跳过第一个Person结构体,指向第二个Person结构体
    personList.erase(iter2); // 删除第二个Person结构体

    // 遍历输出list容器中的数据
    for (auto iter = personList.begin(); iter != personList.end(); iter++) {
        std::cout << iter->name << " " << iter->age << std::endl;
    }
    return 0;
}

输出结果为:

Jerry 18
Tom 20

五、排序操作

使用list容器的sort函数,可以对list容器中的数据进行排序。例如:

#include <list>
#include <iostream>
#include <string>

struct Person {
    std::string name;
    int age;
};

bool operator<(const Person& p1, const Person& p2)
{
    return p1.age < p2.age;
}

int main()
{
    std::list<Person> personList; // 定义存储Person结构体的list容器

    personList.push_back({"Tom", 20}); // 在List容器尾部添加第一个Person结构体
    personList.push_back({"Jerry", 18}); // 在List容器尾部添加第二个Person结构体
    personList.push_back({"John", 25}); // 在List容器尾部添加第三个Person结构体

    personList.sort(); // 按年龄从小到大排序

    // 遍历输出list容器中的数据
    for (auto iter = personList.begin(); iter != personList.end(); iter++) {
        std::cout << iter->name << " " << iter->age << std::endl;
    }
    return 0;
}

输出结果为:

Jerry 18
Tom 20
John 25

六、总结

通过本攻略的例子,我们可以看到list容器对于结构体的增加、删除、排序等操作非常方便。特别是对于排序这一操作,list容器自带排序函数,极大地方便了编程人员的工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ STL之list对结构体的增加,删除,排序等操作详解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#中通过API实现的打印类 实例代码

    以下是一个使用C#中API实现的打印类的示例代码: using System; using System.Drawing.Printing; class Program { static void Main() { PrintDocument pd = new PrintDocument(); pd.PrintPage += new PrintPageEve…

    C# 2023年5月15日
    00
  • C#文字换行的实现方法

    以下是关于“C#文字换行的实现方法”的详细讲解: 什么是C#文字换行? 在C#编程中,当需要一个字符串在多行上显示时,就需要用到文字换行。文字换行就是指当字符串中出现了换行符(\n),文字就会跳到下一行续写,从而形成多行的字符串。 C#文字换行的实现方法 方法1:使用\n换行符 在C#中,可以通过在字符串中添加\n来实现文字的换行,具体代码如下: strin…

    C# 2023年6月8日
    00
  • C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐)

    C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐)是一款完全开源免费的人脸识别程序,使用者可以在本地环境下运行,不需要联网即可进行人脸识别。下面是详细的使用攻略。 1. 安装ArcSoft SDK 首先,在官网下载并安装ArcSoft SDK,根据自己的操作系统版本选择相应的SDK安装包,可以在ArcSoft官网的开发者中心下载: http://w…

    C# 2023年5月15日
    00
  • asp.net(c#)复数类(复数加减乘除四则运算)

    ASP.NET (C#)复数类(复数加减乘除四则运算) 简介 复数是一个由实部和虚部组成的数,实部和虚部都是实数。在科学技术领域中,复数常用于描述具有大小和相位的量,例如电位。 在ASP.NET (C#)中,我们可以定义并使用自己的复数类,实现复数的四则运算,并进行加减乘除等操作。下面将详细介绍如何编写一个复数类。 定义复数类 为了定义一个复数类,我们需要考…

    C# 2023年6月3日
    00
  • C# Directory.CreateDirectory – 创建目录

    Directory.CreateDirectory 方法的作用和使用方法 Directory.CreateDirectory 方法概述 Directory.CreateDirectory 方法用于创建指定路径下的所有目录。如果要创建一个新的目录,需要使用该方法。Directory.CreateDirectory 方法是 System.IO 命名空间的静态方法…

    C# 2023年4月19日
    00
  • c#一个定时重启的小程序实现代码第2/2页

    下面是针对“c#一个定时重启的小程序实现代码第2/2页”的完整攻略: 1. 需求概述 该小程序的核心需求是能够在指定的时间周期内自动重启电脑,具体来说,需要实现以下两个功能: 1)程序能够在指定的时间(例如凌晨3点)自动重启电脑; 2)用户可以设置重启周期(例如每隔1天重启一次)。 2. 实现思路 为了实现以上两个功能,我们需要采用以下步骤: 1)获取当前时…

    C# 2023年6月6日
    00
  • 浅谈C#泛型的用处与特点

    浅谈C#泛型的用处与特点 什么是C#泛型? C# 泛型是一种类型参数化的技术,可以使用一个通用的方法或类来处理多种数据类型。通过使用泛型,可以编写更加灵活和可重用的代码,同时也可以提高代码的可维护性和可读性。 C#泛型的用处 提高代码的复用性 使用泛型可以编写更加通用的代码,可以处理多种类型的数据。不同于传统的方法和类,使用泛型可以更加直观和简单地完成类型的…

    C# 2023年5月15日
    00
  • C#实现串口通信的示例详解

    下面我就开始详细讲解“C#实现串口通信的示例详解”的完整攻略。 总体介绍 首先我们需要了解C#实现串口通信的基本原理,即通过串口通信协议在计算机和设备之间进行数据的传输。常见的应用场景包括连接硬件设备、嵌入式系统通讯等。为了实现串口通信,需要使用C#编程实现数据的发送和接收。同时,我们还需要设置串口的各种参数,如波特率、数据位、校验位、停止位等,以确保稳定的…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部