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


目录
相关文章
|
1月前
|
弹性计算 Kubernetes 网络协议
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
|
2月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
22 3
|
4月前
|
Java API 存储
Java如何对List进行排序?
【7月更文挑战第26天】
206 9
Java如何对List进行排序?
|
3月前
|
存储 Java API
【Java高手必备】揭秘!如何优雅地对List进行排序?掌握这几种技巧,让你的代码瞬间高大上!
【8月更文挑战第23天】本文深入探讨了Java中对List集合进行排序的各种方法,包括使用Collections.sort()、自定义Comparator以及Java 8的Stream API。通过示例代码展示了不同情况下如何选择合适的方法:从简单的整数排序到自定义类对象的排序,再到利用Comparator指定特殊排序规则,最后介绍了Stream API在排序操作中的简洁应用。理解这些技术的区别与应用场景有助于提高编程效率。
73 4
|
3月前
|
存储 容器
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
19 0
|
3月前
|
索引 容器
容器镜像解析问题之通过ImageIndex 接口返回其 IndexManifest如何解决
容器镜像解析问题之通过ImageIndex 接口返回其 IndexManifest如何解决
19 0
|
3月前
|
容器
容器镜像解析问题之通过 ImageIndex 接口获取其引用的 Image 或 ImageIndex如何解决
容器镜像解析问题之通过 ImageIndex 接口获取其引用的 Image 或 ImageIndex如何解决
14 0
|
5月前
|
C++ 容器
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
|
5月前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
62 5
|
5月前
|
编译器 C++ 容器
【C++/STL】:list容器的深度剖析及模拟实现
【C++/STL】:list容器的深度剖析及模拟实现
44 2