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#连接SQL Server的实现方法

    C#连接SQL Server的实现方法 在使用C#编程时,我们经常需要连接SQL Server来操作数据库。下面是连接SQL Server的几种实现方法。 1. 使用SqlConnection SqlCommand和SqlConnection是.NET框架中连接SQL Server最基本的两个类,SqlConnection类用来连接一个SQL Server的…

    C# 2023年6月2日
    00
  • .NET 6线程池ThreadPool实现概述

    “.NET 6线程池ThreadPool实现概述”指 .NET 6 中线程池 ThreadPool 的实现方法和相关概念。本攻略将会对线程池的基础概念、线程池的创建、使用、回收等过程进行详细讲解,并提供两个示例说明以帮助读者深入理解。 1、线程池的基础概念 1.1 线程池概述 线程池是管理线程的一个集合。线程池中的所有线程统一由线程池管理,极大地降低了线程的…

    C# 2023年6月6日
    00
  • C#中DataTable实现行列转换的方法

    下面是C#中DataTable实现行列转换的方法的完整攻略。 前言 在数据处理过程中,行列转换是常见的需求之一。在C#中,我们可以使用DataTable实现行列转换并进行后续操作。本文将详细介绍如何在C#中使用DataTable来实现行列转换。 方法一:使用LINQ进行转换 使用LINQ可以实现简单方便的行列转换。 步骤一:创建DataTable 首先,我们…

    C# 2023年5月31日
    00
  • C# 实现特殊字符快速转码

    下面是 “C# 实现特殊字符快速转码”的完整攻略。 1. 简介 在我们的开发过程中,经常要用到一些特殊字符如“<”,“>”,“&”等,但是这些字符在 HTML 网页中是有特殊含义的,而我们又不希望这些字符会影响网页的显示。为了解决这一问题,我们可以将这些特殊字符进行转义操作,即将其转化为特定的实体字符,以防止其在 HTML 中的意外转换。…

    C# 2023年5月31日
    00
  • C#中实现PriorityQueue优先级队列的代码

    实现PriorityQueue(优先级队列)在C#中是很常见的需求,下面我将为大家介绍如何使用C#编写PriorityQueue。 什么是PriorityQueue? PriorityQueue,即优先队列,是一种按照元素优先级进行排序的队列,具有以下特点: 在队列中插入元素时,会按照一定的优先级排序; 在队列中弹出元素时,会弹出队列中优先级最高的元素; 可…

    C# 2023年6月7日
    00
  • C#中datatable序列化与反序列化实例分析

    下面是详细的攻略。 C#中datatable序列化与反序列化实例分析 简介 DataTable(数据表)是C#中用来存储表格形式数据的对象,它可以存储各种数据类型(比如字符串、整数、浮点数等)。在开发中,我们经常需要将DataTable传输到其他地方(比如网络上)或者将其保存到文件中等,这时我们就需要对DataTable进行序列化和反序列化。 序列化 序列化…

    C# 2023年5月31日
    00
  • asp.net(C#)函数对象参数传递的问题

    ASP.NET是一种基于.NET框架的Web应用程序开发技术,而C#是一种强类型的编程语言。在ASP.NET(C#)中,函数对象参数传递是必不可少的组成部分。本文将详细介绍如何处理ASP.NET(C#)函数对象参数传递的问题。 什么是函数对象参数传递? 函数对象参数传递是指在C#中传递函数对象作为参数的过程。这种方式可以让我们更加灵活地处理业务逻辑,实现不同…

    C# 2023年6月1日
    00
  • c#生成自定义图片方法代码实例

    下面是关于使用C#生成自定义图片方法的完整攻略。 1. 确定图片尺寸和格式 生成自定义图片前,需要先确定图片的尺寸和格式。尺寸可以由用户自定义,格式可以选择常见的png、jpeg等格式。 2. 创建Bitmap对象并初始化 在C#中,使用Bitmap对象来创建和处理图片。可以使用Bitmap类的构造函数来创建一个新的Bitmap对象。例如: Bitmap b…

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