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日

相关文章

  • 在IIS上部署ASP.NET Core Web API的方法步骤

    在IIS上部署ASP.NET Core Web API的方法步骤 部署ASP.NET Core Web API到IIS上需要以下步骤: 在Visual Studio中发布应用程序。 在IIS中创建一个新的网站。 将应用程序发布到IIS中创建的网站。 以下是每个步骤的详细说明: 步骤1:在Visual Studio中发布应用程序 在Visual Studio中…

    C# 2023年5月16日
    00
  • 基于mvc5+ef6+Bootstrap框架实现身份验证和权限管理

    基于mvc5+ef6+Bootstrap框架实现身份验证和权限管理的完整攻略如下: 1. 环境准备 首先,需要安装Visual Studio(建议安装最新版),并安装.Net Framework、MVC5、EF6等程序集。安装完后,打开Visual Studio,创建一个MVC5项目作为基础框架。 2. 实现身份验证 2.1 配置身份认证 在MVC5项目中,…

    C# 2023年5月31日
    00
  • Docker安装部署Net Core实现过程解析

    Docker安装部署Net Core实现过程解析 Docker是一种容器化技术,可以将应用程序及其依赖项打包到一个容器中,使其可以在任何环境中运行。在本文中,我们将讨论如何使用Docker安装和部署.NET Core应用程序。 步骤1:安装Docker 在开始之前,您需要在您的计算机上安装Docker。您可以从Docker官网下载并安装Docker。 步骤2…

    C# 2023年5月16日
    00
  • 在C#中使用MSMQ的方法

    在C#中使用MSMQ是一种消息传递机制,用于在应用程序之间传递消息。MSMQ提供了可靠的消息传递,即使在网络故障或应用程序崩溃的情况下也能保证消息的传递。本文将提供详细的“在C#中使用MSMQ的方法”的完整攻略,包括什么是MSMQ、如何使用MSMQ以及两个示例。 什么是MSMQ? MSMQ是Microsoft Message Queuing的缩写,是一种消息…

    C# 2023年5月15日
    00
  • C# File.ReadAllText()方法: 读取指定文件的所有文本

    C#中的File.ReadAllText()函数 在C#语言中,File类中提供了一个ReadAllText()函数,用于读取指定文件的所有内容。 函数语法 File.ReadAllText(string path); path : 要读取的文件路径。 函数作用 File.ReadAllText()函数将读取指定路径的文件的所有内容,并将其作为字符串返回。 …

    C# 2023年4月19日
    00
  • C#工程建立后修改工程文件名与命名空间操作

    C#工程的文件名与命名空间是非常重要的,因为它们直接影响了代码的可维护性与可重用性。在建立C#工程时,如果文件名与命名空间不符合要求,需要进行修改。下面是完整的操作攻略。 步骤一:建立工程并修改文件名 使用Visual Studio新建一个C#工程。 右键单击解决方案管理器中的工程节点,选择“重命名”。 输入新的文件名并按下Enter键。 在弹出的对话框中选…

    C# 2023年5月15日
    00
  • 深入理解C#泛型:new与where关键字全解析

    C#泛型中new和where是重要的关键字,它们都可以用于约束泛型类型参数的限制;它们都用于提高代码的安全性和可用性,它们的作用在很大程度上提高了代码的可读性和可维护性。在这篇文章中,我们将一起了解泛型中的new和where,以及它们之间的区别。 1. new关键字 在C#泛型中,new关键字被用于指定泛型类型参数必须具有公共的无参数构造函数。 使用new关…

    C# 2023年4月30日
    00
  • C# PictureBox图片控件实现图片交换

    下面是“C# PictureBox图片控件实现图片交换”的完整攻略: 简介 在.NET Windows Forms应用程序中,PictureBox控件是一个常用的控件,用于显示图像并对其进行操作。其中,图片交换是一个常见的操作,本文将从以下几个方面介绍如何使用PictureBox控件实现图片交换: PictureBox控件的基本使用; 从本地文件读取图片并显…

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