如何在示例程序中使用 C++ STL 队列
如果您在超市(或其他任何地方)排队,队列中的第一个顾客将得到服务,然后是下一个,依此类推。
在编程术语中,尤其是在数据结构中,这个概念被称为 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 个元素时,可能会感觉到列表的不好的一面。为了改进原始列表,您可以部署一些技巧。
- 点赞
- 收藏
- 关注作者
评论(0)