【小白学习C++ 教程】二十二、C++ 中的STL容器stack、queue和map

举报
毛利 发表于 2021/08/25 00:45:22 2021/08/25
【摘要】 @Author:Runsen STL 中的栈容器是一种容器适配器。在栈容器中,元素在一端插入并在同一端删除。 stack 为了实现堆栈容器,我们需要在我们的程序中包含头文件<stack>...

@Author:Runsen

STL 中的栈容器是一种容器适配器。在栈容器中,元素在一端插入并在同一端删除。

stack

为了实现堆栈容器,我们需要在我们的程序中包含头文件<stack>

#include<stack>

  
 
  • 1

stack容器的一般声明语法是:

stack<objectType> stackNam

  
 
  • 1

下面介绍下STL 中stack容器支持的各种操作。

  • push 操作用于在堆栈中插入一个元素。此操作始终在堆栈顶部添加元素。
  • pop 操作用于从堆栈中删除元素。移除的元素是栈顶指向的元素。
  • top : 返回栈顶元素。
  • empty : 检查堆栈是否为空。
  • size:返回栈的大小,即栈中元素的数量。
#include <iostream>
#include <stack>
using namespace std;
int main() {
    stack<int> stack;
    stack.push(21);
    stack.push(22);
    stack.push(24);
    stack.push(25);
     
    stack.pop();
    stack.pop();
 
    while (!stack.empty()) {
        cout << ' ' << stack.top();
        stack.pop();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

queue

元素添加到队列的后面,而从队列的前面删除。一般来说,队列采用先进先出(FIFO)的排列方式。

要在程序中实现队列容器,我们必须在代码中包含一个头文件 <queue>

队列支持的各种操作。

  • empty() – 返回队列是否为空。
  • size() – 返回队列的大小。
  • swap():交换两个队列的内容,但队列的类型必须相同,尽管大小可能不同。
  • emplace():在队列容器中插入一个新元素,新元素被添加到队列的末尾。
  • queue::front() 和 queue::back() – front()函数返回对队列第一个元素的引用。back()函数返回对队列最后一个元素的引用。
  • push(g) 和 pop() – push()函数在队列末尾添加元素“g”。pop()函数删除队列的第一个元素。
#include <iostream>
#include <queue>

using namespace std;

// Print the queue
void showq(queue<int> gq)
{
    queue<int> g = gq;
    while (!g.empty()) {
        cout << '\t' << g.front();
        g.pop();
    }
    cout << '\n';
}

// Driver Code
int main()
{
    queue<int> gquiz;
    gquiz.push(10);
    gquiz.push(20);
    gquiz.push(30);

    cout << "The queue gquiz is : ";
    showq(gquiz);

    cout << "\ngquiz.size() : " << gquiz.size();
    cout << "\ngquiz.front() : " << gquiz.front();
    cout << "\ngquiz.back() : " << gquiz.back();

    cout << "\ngquiz.pop() : ";
    gquiz.pop();
    showq(gquiz);
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

map

map是具有键值对的关联容器,因此键值始终是唯一的。map中的键可以插入或删除,但不能更改。另一方面,可以更改与键关联的值。

  • at 和 [ ]:运算符 at和 [ ] 用于访问map元素。at 和 [] 具有相同的功能,但只有一个区别。如果映射中不存在访问的键,则“at ”运算符会引发异常。而 [ ] 运算符会在映射中不存在访问的键时在map中插入新键。
  • begin : 返回map中第一个元素的迭代器。
  • end:返回指向map中最后一个元素之后的元素的迭代器。
#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<int, int> mymap{ {1,10},{2,20},{3,30} };
    map<int, int> ::iterator it;
    cout << "\nThe map mymap is : \n";
    cout << "\tKEY\tVALUE\n";
    for (it = mymap.begin(); it != mymap.end(); ++it) {
        cout << '\t' << it->first
            << '\t' << it->second << '\n';
    }
    cout << endl;
    mymap.at(2) = 10; 
    mymap[3] = 10; 
    cout << "\nThe map mymap is : \n";
    cout << "\tKEY\tVALUE\n";
    for (it = mymap.begin(); it != mymap.end(); ++it) {
        cout << '\t' << it->first
            << '\t' << it->second << '\n';
    }
    cout << endl;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

输出如下

The map mymap is :
        KEY     VALUE
        1       10
        2       20
        3       30


The map mymap is :
        KEY     VALUE
        1       10
        2       10
        3       10

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

unordered_map

unordered_map 是一个关联容器,用于存储由键值和映射值组合形成的元素。map的API 对于unordered_map 的操作基本相同。

#include <iostream>
#include <unordered_map>
using namespace std;
 
int main()
{
    unordered_map<string, int> umap;
 
    umap["1"] = 10;
    umap["2"] = 20;
    umap["3"] = 30;
 
    for (auto x : umap)
      cout << x.first << " " << x.second << endl;
 
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

map和unordered_map的对比:

map 操作的平均时间复杂度为 O(log n) 而对于 unordered_map,平均时间复杂度为 O(1)。

对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map,但是空间占用上unorder_map要高于map,因为unorder_map占用的内存更加高一点,unorder_map内部采用hash表,map内部采用的是红黑树,内存占有率的问题转化成hash表 VS 红黑树,还是unorder_map内存要高一点

文章来源: maoli.blog.csdn.net,作者:刘润森!,版权归原作者所有,如需转载,请联系作者。

原文链接:maoli.blog.csdn.net/article/details/119878414

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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