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

yizhihongxing

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#中使用Spire.doc对word的操作方式

    下面我就来为您详细讲解一下C#中使用Spire.doc对Word的操作方式。 什么是Spire.doc? Spire.doc for .NET 是一款专业的Word文档操作组件,它可以帮助开发者实现对Word文件的创建、读取、编辑、转换及打印等操作,而且具有很好的性能和稳定性。 Spire.doc的安装 首先,我们需要在官网下载Spire.Doc for .…

    C# 2023年6月1日
    00
  • C#中DataTable 转实体实例详解

    下面是关于“C#中DataTable 转实体实例详解”的完整攻略: 1. 为什么需要将DataTable转为实体实例 在C#中,DataTable是一种非常常见的数据类型。在我们进行数据查询、统计和展示时,经常使用DataTable来存储数据。而在使用DataTable时,我们通常需要将DataTable中的数据转化为我们自定义的实体类型,利用实体的属性和方…

    C# 2023年5月31日
    00
  • Unity登录注册时限制发送验证码次数功能的解决方法

    Unity登录注册时限制发送验证码次数功能的解决方法可以通过以下几步实现: 1. 设计数据库结构 在设计数据库时,为用户表添加两个属性字段,一个是上次发送验证码时间,一个是发送验证码次数。例如: CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(255) NOT NUL…

    C# 2023年6月3日
    00
  • 怎么利用c#修改services的Startup type

    要利用C#修改Windows服务的启动类型(Startup type),可以使用.NET Framework下的ServiceController和ServiceType类。步骤如下: 步骤一:添加引用 在项目中添加System.ServiceProcess引用。 步骤二:获取服务 使用ServiceController类获取要修改的服务,可以用服务名称或服…

    C# 2023年6月6日
    00
  • C#实现汽车租赁系统项目

    C# 实现汽车租赁系统项目 汽车租赁系统是一个比较实用的项目,可以用来锻炼 C# 编程技能。下面我们将详细讲解如何实现这个项目。 需求分析 首先我们需要对项目的需求进行分析。汽车租赁系统主要有以下几个功能模块: 用户管理:包括用户登录、注册、修改个人信息等操作。 车型管理:包括添加、删除、修改车型信息等操作。 车辆管理:包括添加、删除、修改车辆信息等操作。 …

    C# 2023年6月7日
    00
  • c# 连接池的设置与使用

    关于c#连接池的设置与使用,我会提供以下内容: 什么是连接池 连接池是一种技术,用于维护和管理连接的缓存,自动分配和回收数据库连接对象。当应用程序请求连接资源时,连接池会检查是否有可用的连接对象,如果有就直接返回给应用程序,没有则自动创建连接对象,并将其添加到连接池中。当应用程序不再使用连接对象时,连接池会将连接对象回收并重新放回池中供下次使用。 配置连接池…

    C# 2023年5月15日
    00
  • C#对Xamarin框架进行数据绑定

    请听我详细讲解” C#对Xamarin框架进行数据绑定”的完整攻略。 1. 什么是Xamarin框架 Xamarin是一款允许使用C#语言来进行开发跨平台移动应用程序的开发框架,可直接使用Xamarin工具包进行iOS,Android,和Windows Phone应用的开发。 2. 使用数据绑定 2.1 简介 数据绑定是Xamarin中一种独特的将数据从一个…

    C# 2023年6月3日
    00
  • asp.net实现在非MVC中使用Razor模板引擎的方法

    请允许我详细讲解如何在非MVC中使用Razor模板引擎。 Razor模板引擎简介 Razor是一种简单而又强大的视图引擎,在ASP.NET中广泛使用。Razor模板引擎的主要功能是将服务器端代码和HTML标记结合在一起,以生成最终的HTML文档。 在非MVC中使用Razor模板引擎的方法 步骤1:安装相关NuGet包 在使用Razor模板引擎之前,我们需要先…

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