首页 > 编程语言 >【STL】 C++常用容器介绍系列(一)----(map、set、stack)

【STL】 C++常用容器介绍系列(一)----(map、set、stack)

时间:2024-03-18 14:29:25浏览次数:18  
标签:map set STL 复杂度 stack 哈希 unordered

目录

一、map系列

1、map介绍

2、unordered_map介绍

3、map和unordered_map的选择

二、set系列

1、set介绍

2、unordered_set介绍

3、set和unordered_set的选择

三、如何遍历和查询map和set

1、map的遍历

2、map的查询

3、set的遍历

4、set的查询

四、stack介绍和操作stack的方法

1、stack的介绍

2、操作stack的方法


一、map系列

1、map介绍

   底层实现:map 是基于红黑树实现的,它保持元素的有序性,插入、删除和查找的时间复杂度       为 O(log n);  

   有序性:map 中的元素是按照键的大小有序排列的


2、unordered_map介绍

   底层实现: unordered_map 是基于哈希表实现的,它不保持元素的顺序,插入、删除和查找的     时间复杂度为平均 O(1)

   有序性: unordered_map 中的元素是无序的。

   内存占用:unordered_map 通常会占用更多的内存,因为哈希表需要额外的空间来存储哈希函       数。


3、map和unordered_map的选择

  1. 有序性要求:如果需要元素按照键的顺序排列,应该选择map;如果对元素的顺序没有要求,可以选择unordered_map

  2. 时间复杂度:如果对插入、删除和查找操作的时间复杂度有严格要求,且数据量较大,可以选择unordered_map,因为它的平均时间复杂度更低;如果数据量较小或对时间复杂度要求不高,可以选择map

  3. 内存占用unordered_map通常会占用更多的内存,因为哈希表需要额外的空间来存储哈希函数,如果内存占用是考虑的因素,可以选择map


二、set系列

1、set介绍

底层实现:set 是基于红黑树实现的,插入、删除和查找的时间复杂度为 O(log n)

有序性:set 中的元素是按照键的大小有序排列的;


2、unordered_set介绍

底层实现: unordered_set 是基于哈希表实现的,插入、删除和查找的时间复杂度为平均 O(1)

有序性: unordered_set 中的元素是无序的。

内存占用:unordered_set 通常会占用更多的内存,因为哈希表需要额外的空间来存储哈希函数。


3、set和unordered_set的选择

  1. 有序性要求:如果需要元素按照键的顺序排列,应该选择set;如果对元素的顺序没有要求,可以选择unordered_set

  2. 时间复杂度unordered_set的插入、删除和查找操作的平均时间复杂度通常比set低,因为unordered_set基于哈希表实现;如果对操作的时间复杂度有要求,可以选择unordered_set

  3. 内存占用unordered_set通常会占用更多的内存,因为哈希表需要额外的空间来存储哈希函数;如果内存占用是考虑的因素,可以选择set

  4. 遍历顺序:如果需要按照键的顺序遍历元素,应该选择set;如果对遍历顺序没有要求,可以选择unordered_set


三、如何遍历和查询map和set

   有很多方法能遍历,这里只介绍最本人认为最简单的range for法:

1、map的遍历

  first是键,second是值

#include <bits/stdc++.h>
using namespace std;

int main() {
    unordered_map<string, int> mp;

    for (auto it : mp) {
        cout << it.first << " " << it.second << endl;
    }

}

2、map的查询

​
#include <bits/stdc++.h>
using namespace std;

int main() {
    unordered_map<string, int> mp;
    int x;
    cin>>x;
    cout<<mp[x]<<endl;
}

​

     如果输入的x存在于map中,会输出他的值,如果输入的 x 不在 mp 中,程序会输出0。


3、set的遍历

​
#include <bits/stdc++.h>
using namespace std;

int main() {
    unordered_map<int> set;

    for (auto it : set) {
        cout << it<< endl;
    }

}

​


4、set的查询

#include <iostream>
#include <set>
using namespace std;
int main() {
    set<int> mySet = {3, 1, 4, 1, 5, 9};

    int value = 4;
    auto it = mySet.find(value);

    if (it != mySet.end()) {
      cout << "Value " << value << " found in the set" << endl;
    } else {
        cout << "Value " << value << " not found in the set" << endl;
    }

    return 0;
}

   使用 find 函数来查找该值是否存在于 set中 如果这个it=mySet.end()说明没找到


四、stack介绍和操作stack的方法

1、stack的介绍

         栈(stack)是一种数据结构,遵循后进先出原则,即最后放入栈的元素最先被取出。

                             

  可以把这个当做一个只有一个开口的容器,我们往每次往里面放东西都会压到之前放的上面,如果要取东西则只能取最上面的。

2、操作stack的方法

  1. push(element): 将元素压入栈顶。
  2. pop(): 弹出栈顶元素。
  3. top(): 返回栈顶元素的引用,但不将其从栈中移除。
  4. empty(): 检查栈是否为空,返回 true 如果栈为空,否则返回 false
  5. size(): 返回栈中元素的个数。

以下是一个简单代码示例演示:

#include <iostream>
#include <stack>
using namespace std;
int main() {
    stack<int> myStack;

    // 压入元素
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 访问栈顶元素
   cout << "Top element: " << myStack.top() << endl;

    // 弹出栈顶元素
    myStack.pop();

    // 访问栈顶元素
    cout << "Top element after pop: " << myStack.top() << endl;

    // 检查栈是否为空
    if (myStack.empty()) {
        cout << "Stack is empty" <<endl;
    } else {
        cout << "Stack is not empty" << endl;
    }

    // 获取栈中元素个数
   cout << "Stack size: " << myStack.size() << endl;

    return 0;
}

标签:map,set,STL,复杂度,stack,哈希,unordered
From: https://blog.csdn.net/2301_77961281/article/details/136806644

相关文章

  • 问题分析 | 为什么主库Waiting for semi-sync ACK from slave会阻塞set global super_
    作者:卢文双资深数据库内核研发本文首发于2023-12-0321:33:21https://dbkernel.com问题描述为什么主库上有Waitingforsemi-syncACKfromslave的时候,执行setglobalsuper_read_only=ON会导致等待全局读锁?问题复现MySQL主从高可用集群,semi-sync超时无限大:setglob......
  • 实现 React-redux(一) connect 和 mapStateToProps
    1.结合context和storeimportReact,{Component}from'react';importPropTypesfrom'prop-types'functioncreateStore(reducer){letstate=nullconstlisteners=[]constsubscribe=(listener)=>listeners.push(listener)con......
  • 实现 React-redux(二) mapDispatchToProps
     App.js:importReact,{Component}from'react';importPropTypesfrom'prop-types'importHeaderfrom'./Header'functioncreateStore(reducer){letstate=nullconstlisteners=[]constsubscribe=(listener)=>l......
  • STL容器之list类
    文章目录STL容器之list类1、list的介绍2、list的使用2.1、list的常见构造2.2、list的iterator的使用2.3、list空间增长问题2.4、list的增删查改2.5、list迭代器失效问题3、list的模拟实现(含反向迭代器)STL容器之list类1、list的介绍list是序列容器,允许在序列中......
  • C++STL第四篇(最简单的栈和队列)
    stack&queuestackstack是一种先进后出(FirstInLastOut,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。有元素推入栈的操作称为:push,将元......
  • 学习JavaEE的日子 Day27 手撕HashMap底层原理
    Day271.手撕HashMap底层原理(重点)publicclassTest01{ publicstaticvoidmain(String[]args){ // Floatfloat1=newFloat("0.0f");// Floatfloat2=newFloat("0.0f");// Floatresult=float1/float2;// System.out.println(result);/......
  • react中setState是同步的还是异步的
    首先说一下setState是同步的还是异步的?1.解读setState工作流 接下来我们就沿着这个流程,逐个在源码中对号入座。首先是setState入口函数:ReactComponent.prototype.setState=function(partialState,callback){this.updater.enqueueSetState(this,partialSta......
  • C++ STL第三篇(搞清楚deque原理和有多少用法)
    dequeVector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。Deque容器和vector容器最大的差异,一在于deque允许......
  • STM32第九节(中级篇):RCC(第二节)——讲解系统时钟配置函数SetSysClockTo72
    目录前言STM32第九节(中级篇):RCC(第二节)——讲解系统时钟配置函数SetSysClockTo72代码内容位置及检索分析代码 代码展示时钟控制使能闪存控制寄存器配置AHP,APB1,APB2的总线时钟配置锁相环时钟 超频操作小结前言    上节课我们讲了理论部分,那么我们这节课......
  • ic基础|时序篇06:输入约束set_input_delay与输出约束set_output_delay详解
    大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看......