如何在示例程序中使用 C++ STL 队列

举报
Tiamo_T 发表于 2021/09/30 16:26:13 2021/09/30
【摘要】 如果您在超市(或其他任何地方)排队,队列中的第一个顾客将得到服务,然后是下一个,依此类推。在编程术语中,尤其是在数据结构中,这个概念被称为 FIFO(先进先出)队列。在 C++ 中,Queue 是 STL(标准模板库)的重要组成部分。除了典型的 FIFO 队列外,几乎没有其他类型的队列。例如,优先队列。在优先队列中,除了 FIFO 特性之外,某些客户(或队列中的元素)可能具有更高的优先级,并...

如果您在超市(或其他任何地方)排队,队列中的第一个顾客将得到服务,然后是下一个,依此类推。

在编程术语中,尤其是在数据结构中,这个概念被称为 FIFO(先进先出)队列。

在 C++ 中,Queue 是 STL(标准模板库)的重要组成部分。

除了典型的 FIFO 队列外,几乎没有其他类型的队列。例如,优先队列。

在优先队列中,除了 FIFO 特性之外,某些客户(或队列中的元素)可能具有更高的优先级,并且无论他们在队列中的位置如何,他们都可能立即获得服务。

在本教程中,我们将讨论 STL 队列的以下方面:

  • 创建队列
  • 检查队列状态
  • 访问下一个元素
  • 访问最后一个元素
  • 向队列添加新元素
  • 创建元素并将其插入队列
  • 从队列中删除元素
  • 交换元素的内容

以下是创建队列程序所需的几个重要函数/语句:

  • #include <queue>- 为了使用 STL 队列,添加这个包含。这将包括我们正在编写的代码的一些重要文件。
  • queue <type> ourQueue; – 声明某种类型的队列
  • ourQueue.empty(); – 检查队列是否为空。如果队列为空,则答案为真,否则答案为假。
  • ourQueue.size(); – 找出队列中元素的数量。就像 size 一样,您也有 sizeof() 操作。
  • ourQueue.front() 和 ourQueue.back(); – 您可以分别使用 front 和 back 函数访问队列中的第一个元素或队列中的最后一个元素。
  • ourQueue.push(); – 创建队列时,可以使用 push 向队列添加新元素。
  • ourQueue.pop(); – 如果您想从队列中删除元素,请使用 pop 函数:
  • 你也有 emplace 和 swap。Emplace 用于构造和插入元素到队列中。当您需要交换内容时使用交换。这两个函数的语法与上述函数类似。

STL 队列基本示例代码

我们的任务是创建一个队列并向其中添加一些元素(3、6 和 7)。之后,我们将从队列中删除元素。

为了更简单,我将使用一个加密数字,并且将应用很少的公共成员函数。

#include <iostream>
#include <queue>

using namespace std;

int
main( void )
{

queue < int > ourQueue;

cout<<"The occupied place in the memory is = "
       <<ourQueue.size()
       <<endl;

ourQueue.emplace( 3 );
ourQueue.emplace( 6 );
ourQueue.emplace( 7 );


cout<<"The occupied place in the memory is = "
       <<ourQueue.size()
       <<endl
       <<"And with the bits it is ="
       <<ourQueue.size() * sizeof( int )
       <<endl;


while( ! ourQueue.empty() )
{
     int iTemp = ourQueue.front();
     cout<<iTemp<<endl;
     ourQueue.pop();
}

return EXIT_SUCCESS;
}

一般来说,在上面的代码中我们做了以下事情:

  • 创建队列
  • 在添加任何元素之前计算队列的大小
  • 构造和插入少量元素,
  • 计算元素添加后的大小
  • 清空队列内容

以下是改进上述基本代码的一些建议:

1) 首先,也许你可以在上面的程序中添加一些有意义的注释来解释它的作用。

2) 其次,添加几行代码来了解 front 和 pop 的工作原理。

在将这些元素放置到我们的队列中之后,您可能可以在上面的示例代码中添加以下行。

int iTempFront = ourQueue.front(); 
cout<<iTempFront;

之后再添加一次相同的两行代码。现在,在这些添加的代码行之间使用 pop 方法,如下所示:

int iTempFront = ourQueue.front(); 
cout<<iTempFront; 

ourQueue.pop(); 

iTempFront = ourQueue.front(); 
cout<<iTempFront;

3) 第三,添加几行代码以了解 back 是如何工作的。将上面的几行代码替换为以下内容。

int iTempFront = ourQueue.back(); 
cout<<iTempFront; 

ourQueue.pop(); 

iTempFront = ourQueue.back(); 
cout<<iTempFront;

所以,现在您了解了 back 成员函数,您应该能够弄清楚 front 和 back 之间的区别,以及为什么使用 pop。

4)第四,删除这三个 emplace 成员函数,并将该部分代码替换为以下代码:

do
{
  char cChoice;
  cout<<" More elements (y)es / (n)o ->";
  cin>>cChoice;
  
  if( ( cChoice == 'N' ) || ( cChoice == 'n') ) { break;}
 else  if( ( cChoice == 'Y' ) || ( cChoice == 'y'))
  {
      int iNextOne;
      cout<<"Next element->";
      cin>>iNexOne;
      ourQueue.push( iNexOne);
  }
  else
 {
    cout<<"Wrong choice!!!";
    systm("clear");
 }
 
}
while( 1 );

关于队列的其他想法

既然您对队列有了一些基本的了解,那么您还应该了解您可能会遇到的以下两种类型的队列。

  • 有限队列——有限队列是用简单的数组实现的。这种实现大多没什么意思,它在 C 中更有用。
  • 无限队列 - 这使用结构(类)和指针。虽然实际上对此没有限制,但它受到系统上物理资源的限制。

当你开始用 C++ 创建严肃的程序时,你可能有对象队列,或者你的类中可能有一些东西的队列。

在 C 语言的世界中,决定何时使用队列而不是数组很简单。如果您不知道需要存储多少个对象,则数组没有用处。现在,有了向量,您可以在其末尾添加元素,甚至可以交换它们。

两种最基本的动态数据结构是:堆栈和队列。他们很相似。堆栈将返回最后添加的元素。另一方面,队列将返回第一个添加的元素。因此,如果您在一侧添加元素,然后将它们从特定容器中删除,那么这两种数据结构可能是不错的选择。

如果您需要在结构的开头和结尾添加元素 deque 可能会被考虑。这可能是为什么在向量上选择双端队列的原因。但是,如果您需要在我们的数据结构中间添加元素,您可能需要列表。当您需要访问列表的第一个、第二个、第三个或第 n 个元素时,可能会感觉到列表的不好的一面。为了改进原始列表,您可以部署一些技巧。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。