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


目录
相关文章
|
3月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
79 2
|
2月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
48 0
|
3月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
80 5
|
3月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
96 2
|
7月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1099 1
|
6月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
6月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
|
7月前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
255 3
|
6月前
|
存储 Java 索引
Java List接口实现原理与性能评估
Java List接口实现原理与性能评估

热门文章

最新文章