5.1 C++ STL 集合数据容器

c++,stl,集合,数据,容器 · 浏览次数 : 16

小编点评

*设置默认集合排序方式* *创建set容器* *使用自定义比较函数实现自定义比较规则* *插入自定义类型* *显示出自定义类型* *遍历容器输出每个元素的名称和年龄* *示例代码展示如何在set容器中插入自定义的Person数据类型,并通过重载运算符实现自定义的比较规则*

正文

Set/Multiset 集合使用的是红黑树的平衡二叉检索树的数据结构,来组织泛化的元素数据,通常来说红黑树根节点每次只能衍生出两个子节点,左面的节点是小于根节点的数据集合,右面的节点是大于根节点的集合,通过这样的方式将数据组织成一颗看似像树一样的结构,而平衡一词的含义则是两边的子节点数量必须在小于等1的区间以内。

Set集合天生去重,所有元素都会根据元素的键值自动的排序,并且Set元素在确定后无法进行更改,换句话说Set的Iterator是一种Const_iterator,而Multiset则允许出现重复的数据,如需使用只需要将set<int>改为multiset<int>即可,Multiset操作方式与API函数与Set集合保持相同。

5.1 正反向遍历集合元素

这段C++代码使用了STL的set容器,展示了set容器的一些基本操作,包括插入元素、删除元素、判断容器是否为空以及遍历元素并按照一定规则排序。

代码首先创建了一个空的set<int>类型的变量var。然后,代码使用insert()函数向set容器中插入了三个整数,并调用PrintSet()函数遍历输出set容器的元素,并按照从大到小的顺序输出。PrintSet()函数中通过判断flag标记的不同来选择正向还是反向输出set容器的元素。

接下来,代码使用empty()函数判断set容器是否为空,并显示容器的元素个数。

最后,代码展示了erase()函数的用法,从set容器中删除了第一个元素和元素值为99的元素,并再次调用PrintSet()函数输出set容器的元素。

#include <iostream>
#include <set>

using namespace std;

void PrintSet(set<int>& s ,int flag)
{
  if (flag == 1)
  { // 正向遍历元素
    for (set<int>::iterator it = s.begin(); it != s.end(); it++)
      cout << (*it) << " ";
  }
  else if (flag == 0)
  { // 反向遍历元素
    for (set<int>::reverse_iterator it = s.rbegin(); it != s.rend(); it++)
      cout << (*it) << " ";
  }
}

int main(int argc, char* argv[])
{
  set<int> var { };

  var.insert(56);
  var.insert(67);  // 插入元素
  var.insert(99);
  PrintSet(var,0); // 打印并从大到小排列

  if (var.empty()) // 判断是否为空
    cout << "None" << endl;
  else
    cout << "size: " << var.size() << endl;

  var.erase(var.begin());   // 删除第一个元素
  var.erase(99);            // 删除99这个元素
  PrintSet(var, 0);         // 打印并从大到小排列
  system("pause");
  return 0;
}

5.2 查找集合中指定元素

这段C++代码使用了STL的set容器,展示了set容器的一些基本操作,包括查找元素、计算元素个数、寻找较大或较小的元素和查找范围。

代码首先创建了一个set<int>类型的变量var,并在其中插入了一些整数。然后,代码分别使用了find()count()函数来查找元素90是否存在于set容器中,并统计了90出现的次数。

代码接下来展示了lower_bound()upper_bound()函数的用法。其中lower_bound()函数返回第一个值大于或等于给定值的元素的迭代器,upper_bound()函数返回第一个值大于给定值的元素的迭代器。在本例中,代码使用lower_bound()函数和upper_bound()函数来查找set中与值4相邻的元素,并输出了它们的值。

最后,代码展示了equal_range()函数的用法。equal_range()函数返回一个pair,其中第一个迭代器指向set中第一个等于所给值的元素,第二个迭代器指向set中第一个大于所给值的元素。在本例中,代码使用equal_range()函数来查找值为4的元素在set中的范围,并输出了这个范围中的元素。

#include <iostream>
#include <set>

using namespace std;

int main(int argc, char* argv[])
{
  set<int> var { 23,44,56,78,90,0,90,12,54,67,85,3,4,7};

  // 寻找set集合中数值是90的
  set<int>::iterator pos = var.find(90);
  if (pos != var.end())  // 寻找90是否存在
    cout << "找到了: " << *pos << endl;
  
  // count(key) 查找90存在几个,对于set而言返回结果是 1或者0
  int number = var.count(90);
  cout << "90是否存在: " << number << endl;

  // lower_bound(keyElem); 返回第一个 key>=keyElem 元素的迭代器
  set<int>::iterator it = var.lower_bound(4); // 寻找4是否存在
  if (it != var.end())
    cout << "找到了 lower_bound(4) 的值:" << *it << endl;

  // upper_bound(keyElem); 返回第一个 key>keyElem 元素的迭代器
  set<int>::iterator it2 = var.upper_bound(4); // 寻找4相邻值
  if (it2 != var.end())
    cout << "找到了 upper_bound(4) 的值:" << *it2 << endl;

  // equal_range(keyElem) 返回容器中key与keyElem相等的上下限的两个迭代器.
  // 下限就是 lower_bound 上限就是 upper_bound 需要分别迭代输出
  pair<set<int>::iterator, set<int>::iterator> ret = var.equal_range(4);
  if (ret.first != var.end())
    cout << "找到 lower_bound(4): " << *(ret.first) << endl;
  if (ret.second != var.end())
    cout << "找到 upper_bound(4): " << *(ret.second) << endl;

  system("pause");
  return 0;
}

5.3 设置默认集合排序方式

这是一个使用STL中的set容器进行数据存储和排序的示例代码,其中使用了自定义比较函数MyCompare以实现按从大到小的顺序进行排序。set 是一个有序不重复元素集合,它是通过红黑树实现的,插入、删除和查找元素的平均时间复杂度都是O(log n)。在此代码中,set容器存储了int类型的数据,并使用MyCompare作为元素的比较方式,从而实现按从大到小的顺序排序。可以看到,通过set容器和自定义比较函数,我们可以非常方便地实现数据存储和排序的功能。

#include <iostream>
#include <set>
#include <string>

using namespace std;

class MyCompare
{ // 通过仿函数,重载小括号,实现默认从大到小排列
public: bool operator()(int v1, int v2) {
    return v1 > v2;    // 从大到小
    // return v1 < v2; 从小到大
  }
};

int main(int argc, char* argv[])
{
  set<int, MyCompare> var;

  var.insert(6);
  var.insert(3);
  var.insert(9);

  for (set<int, MyCompare>::iterator it = var.begin(); it != var.end(); it++)
    cout << *it << endl;

  system("pause");
  return 0;
}

5.4 向集合插入自定义类型

这段代码演示了如何在set容器中插入自定义的Person数据类型,并且通过重载运算符实现自定义的比较规则。通过MyCompare类定义的比较方法,实现了set容器中自定义类型的降序排列。最后,通过迭代器遍历容器,输出每个Person对象的名字和年龄。

#include <iostream>
#include <set>
#include <string>

using namespace std;

class Person {
public:
  string m_name;
  int m_age;

public: Person(string name, int age) {
  this->m_name = name;
  this->m_age = age;
  }
};

class MyCompare{
  // 通过仿函数,重载,实现默认降序排列
public: bool operator()(const Person & p1, const Person & p2){
    if (p1.m_age > p2.m_age) // 指定为降序排列
      return true;
    return false;
  }
};

int main(int argc, char* argv[])
{
  set<Person,MyCompare> var;

  Person p1("dawa", 22);   // 初始化
  Person p2("xiwa", 44);
  var.insert(p1);          // 插入自定义数据类型
  var.insert(p2);

  // 显示出自定义类型
  for (set<Person, MyCompare>::iterator it = var.begin(); it != var.end();it ++)
  {
    cout << "Name: " << (*it).m_name << "Age: " << (*it).m_age << endl;
  }
  system("pause");
  return 0;
}

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/54f5ffdc.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

与5.1 C++ STL 集合数据容器相似的内容:

5.1 C++ STL 集合数据容器

Set/Multiset 集合使用的是红黑树的平衡二叉检索树的数据结构,来组织泛化的元素数据,通常来说红黑树根节点每次只能衍生出两个子节点,左面的节点是小于根节点的数据集合,右面的节点是大于根节点的集合,通过这样的方式将数据组织成一颗看似像树一样的结构,而平衡一词的含义则是两边的子节点数量必须在小于等1的区间以内。Set集合天生去重,所有元素都会根据元素的键值自动的排序,并且Set元素在确定后无法

5.1 C/C++ 使用文件与指针

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

Boost程序库完全开发指南:1.1-C++基础知识点梳理

主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的。 1.shared_ptr 解析:shared_ptr是一种计数指针,当引用计数变为0时,shared_ptr所指向的对象将会被删除。如下所示

5.1 汇编语言:汇编语言概述

汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。较于高级语言(如C、Python等),汇编语言学习和使用难度相对较大,需要对计算机内部结构、指令集等有深入的了解,以及具有良好的编程习惯和调试能力。但对于需要对计算机底层进行操作的任务,汇编语言是极其高效的,

C++如何在main函数开始之前(或结束之后)执行一段逻辑?

1. 问题 2. 考察的要点 3. 解决策略 3.1. 方案一:使用GCC的拓展功能 3.2. 方案二:使用全局变量 3.3. 方案三:atexit 4. Demo测试 4.1. 测试代码 4.2. 执行结果 5. 程序异常退出场景 5.1. 存在的问题 5.2. 解决方案 5.2.1. 原理 5.

1.5 为x64dbg编写插件

任何一个成熟的软件都会具有可扩展性,可扩展性是现代软件的一个重要特征,因为它使软件更易于维护和适应变化的需求,`x64dbg`也不例外其可通过开发插件的方式扩展其自身功能,`x64dbg`提供了多种插件接口,包括脚本插件、DLL插件、Python插件和.NET插件等。此外,`x64dbg`还支持用户自定义命令和快捷键。这使得用户可以自由地扩展和自定义软件的功能,从而更好地适应开发需求。我们以`C/

1.5 为x64dbg编写插件

任何一个成熟的软件都会具有可扩展性,可扩展性是现代软件的一个重要特征,因为它使软件更易于维护和适应变化的需求,`x64dbg`也不例外其可通过开发插件的方式扩展其自身功能,`x64dbg`提供了多种插件接口,包括脚本插件、DLL插件、Python插件和.NET插件等。此外,`x64dbg`还支持用户自定义命令和快捷键。这使得用户可以自由地扩展和自定义软件的功能,从而更好地适应开发需求。我们以`C/

.NET周刊【5月第1期 2024-05-05】

国内文章 一个开源轻量级的C#代码格式化工具(支持VS和VS Code) https://www.cnblogs.com/Can-daydayup/p/18164905 CSharpier是一个开源、免费的C#代码格式化工具,特点是轻量级且依赖Roslyn引擎重构代码格式。支持的IDE包括Visua

「C++」简单模拟

这是一个公式: \[F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}} \]根据大家的数学经验可以知道这是一个计算斐波那契数列的公式,那么假设我们不知道这是一个斐波

[转帖]echo 输出不换行-e \c

http://www.my889.com/i/1952 在shell中,echo输出会自动换行。有时候在循环中不希望echo输出换行。代码实现如下: 1 echo -e " \c" # -e 表示开启转义, \c表示不换行 脚本: 1 2 3 4 5 6 7 8 9 #!/bin/bash i=1