<C++> list容器本质|常用接口|自定义排序规则(下)

简介: <C++> list容器本质|常用接口|自定义排序规则
void testr()
{
  list<int>L6;
  L6.push_back(10);
  L6.push_back(30);
  L6.push_back(40);
  //判断容器是否为空
  if (L6.empty())
  {
    cout << "list 为空" << endl;
  }
  else {
    cout << "lsit 不为空,元素个数为:" << L6.size() << endl;
  }
  //重新指定大小
  L6.resize(6, 100);
  printInfo(L6);
  L6.resize(3);
  printInfo(L6);
}

2.4、 list 插入和删除

用于对 list容器进行数据的插入和删除

函数原型:


push_back(elem);

在容器尾部加入一个元素

pop_back();

删除容器中最后一个元素

push_front(elem);

在容器开头插入一个元素

pop_front();

从容器开头移除第一个元素

insert(pos,elem);

在pos位置插elem元素的拷贝,返回新数据的位置。

insert(pos,n,elem);

在pos位置插入n个elem数据,无返回值。

insert(pos,beg,end);

在pos位置插入[beg,end)区间的数据,无返回值。

clear();

移除容器的所有数据

erase(beg,end);

删除[beg,end)区间的数据,返回下一个数据的位置。

erase(pos);

删除pos位置的数据,返回下一个数据的位置。

remove(elem);

删除容器中所有与elem值匹配的元素

示例:

void testt()
{
  list<int>L7;
  //尾插
  L7.push_back(1);
  L7.push_back(2);
  L7.push_back(3);
  //头插
  L7.push_front(30);
  L7.push_front(20);
  L7.push_front(10);
  printInfo(L7);
  //插入 insert
  list<int>::iterator t = L7.begin();
  L7.insert(++t, 6);
  //删除 erase
  t = L7.end();//end迭代器指向最后一个有效元素的下一个位置
  L7.erase(--t);
  printInfo(L7);
  //移除
  L7.push_back(10000);
  L7.push_back(10000);
  printInfo(L7);
  L7.remove(10000);
  printInfo(L7);
  //清空
  L7.clear();
  if (L7.empty())
  {
    cout << "list 已经清空" << endl;
  }
}

2.5、list 数据存取

用于对 list容器中数据进行存取

函数原型:


front();

返回第一个元素。

back();

返回最后一个元素。

示例:


void testy()
{
  list<int>L1;
  L1.push_back(10);
  L1.push_back(20);
  L1.push_back(30);
  L1.push_back(50);
  //访问首尾元素
  cout << "第一个元素值为:" << L1.front() << endl;
  cout << "最后一个元素值为:" << L1.back() << endl;
  //不支持下标访问,也不支持随机访问,底层是链表
  list<int>::iterator it = L1.begin();
  it++;//正确
  //it + 1;//错误,不存在与"+"匹配的运算符
}

2.6、list 反转和排序

将容器中的元素反转,以及将容器中的数据进行排序

函数原型:


reverse();

反转链表

sort();

链表排序

反转示例:

void testu()
{
  list<int>L1;
  L1.push_back(10);
  L1.push_back(20);
  L1.push_back(30);
  cout << "反转前:" << endl;
  printInfo(L1);
  cout << "反转后:" << endl;
  L1.reverse();
  printInfo(L1);
}

排序示例:


//用于降序排序
bool myCompare(int v1, int v2)
{
  //降序:让第一个数 > 第二个数
  return v1 > v2;
}
void testi()
{
  list<int>L;
  L.push_back(2);
  L.push_back(1);
  L.push_back(6);
  L.push_back(4);
  L.push_back(5);
  L.push_back(3);
  cout << "排序前:" << endl;
  printInfo(L);
  cout << "升序排序后:" << endl;
  L.sort();
  printInfo(L);
  cout << "降序排序后:" << endl;
  L.sort(myCompare);
  printInfo(L);
}

所有不支持随机访问迭代器的容器,不可以使用标准算法

这些容器内部会提供排序的成员方法

sort是 list容器内部的排序方法,默认为升序排列,可以通过自己编写函数来决定排序的规则。


3、排序案例

3.1、生肖类

class Person
{
public:
  Person(string name, int age, int height)
  {
    this->name = name;
    this->age = age;
    this->height = height;
  }
  //属性
  string name;
  int age;
  int height;
};

3.2、排序规则

//自定义排序规则 compare
bool compare(Person& p1, Person& p2)
{
  //按照身高降序
  if (p1.height == p2.height)
  {
    //如果身高相同,按照年龄升序排序
    return p1.age < p2.age;
  }
  else {
    return p1.height > p2.height;
  }
}

3.3、具体实现与效果

//自定义排序规则 compare
bool compare(Person& p1, Person& p2)
{
  //按照身高降序
  if (p1.height == p2.height)
  {
    //如果身高相同,按照年龄升序排序
    return p1.age < p2.age;
  }
  else {
    return p1.height > p2.height;
  }
}


b4da3633e5ba41e5bf92bf768f303ae4.png


list容器在泛型编程里还是比较重要的,希望我的分享可以给大家带来帮助,最后要个赞不过分吧


目录
相关文章
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
591 35
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
1062 1
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
392 2
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
312 0
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1434 108
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
873 57
|
10月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
861 52
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !