C++ STL 总结(持续更新)

2023-05-16

因为机试需要用c++,暴风吸入式学习(套用)它的模板,发现还真的挺好用的,总结一下。时间紧急,取自各个网上的博客,没来得及仔细整理,都给了我很大帮助,有空了之后再慢慢梳理。这是向c++迈进的一大步!

C++ STL

vector

#include

  • vector v;

  • v.push_back(0);

  • v.pop_back(0);

  • v[0] v.at(0)

  • ² vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

  • ² vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

  • ² vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值

  • assign()

  • begin()和end()

  • front()和back()

list

#include

  • pop_back() 删除最后一个元素
  • pop_front() 删除第一个元素
  • push_back() 在list的末尾添加一个元素
  • push_front() 在list的头部添加一个元素
  • assign()
  • reverse()
  • merge()
  • l1.insert(l1.begin(),100); 在l1的开始位置插入100。
  • l1.insert(l1.begin(),2,200); 在l1的开始位置插入2个100。
  • l1.insert(l1.begin(),l2.begin(),l2.end());在l1的开始位置插入l2的从开始到结束的所有位置的元素。
  • l1.erase(l1.begin()); 将l1的第一个元素删除。
  • l1.erase(l1.begin(),l1.end()); 将l1的从begin()到end()之间的元素删除。
  • begin()和end()
  • front()和back()

deque

#include

  • push_back,push_front
  • pop_back,pop_front 只删除,不返回
  • [] at()
  • erase()
  • insert()
  • begin()和end()
  • front()和back()

stack

#include

(stack没有迭代器,所以除了顶部元素,无法存取其它元素,即不能遍历stack。用vector或者是deque来实现)
  • top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
  • push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
  • push(T&& obj):以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
  • void pop():弹出栈顶元素。
  • size():返回栈中元素的个数。
  • empty():在栈中没有元素的情况下返回 true。
  • emplace():用传入的参数调用构造函数,在栈顶生成对象。
  • swap(stack & other_stack):将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于 stack 对象有一个特例化的全局函数 swap() 可以使用。

queue

#include

(用deque实现)
  • \1. push
  • \2. pop
  • \3. size
  • \4. empty
  • \5. front
  • \6. back

set

#include

(实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值;另外,还得确保根节点的左子树的高度与右子树的高度相等,这样,二叉树的高度最小,从而检索速度最快。要注意的是,它不会重复插入相同键值的元素,而采取忽略处理。平衡二叉检索树的检索使用中序遍历算法)
  • begin()–返回指向第一个元素的迭代器
  • clear()–清除所有元素
  • count()–返回某个值元素的个数 s.count(20)
  • empty()–如果集合为空,返回true
  • end()–返回指向最后一个元素的迭代器
  • equal_range()–返回集合中与给定值相等的上下限的两个迭代器
  • erase()–删除集合中的元素。删除的对象可以是某个迭代器位置上的元素、等于某键值的元素、一个区间上的元素和清空集合。
  • find()–返回一个指向被查找到元素的迭代器。s.find(20) != s.end()
  • get_allocator()–返回集合的分配器
  • insert()–在集合中插入元素
  • lower_bound()–返回指向大于(或等于)某值的第一个元素的迭代器
  • key_comp()–返回一个用于元素间值比较的函数
  • max_size()–返回集合能容纳的元素的最大限值
  • rbegin()–返回指向集合中最后一个元素的反向迭代器
  • rend()–返回指向集合中第一个元素的反向迭代器
  • size()–集合中元素的数目
  • swap()–交换两个集合变量
  • upper_bound()–返回大于某个值元素的迭代器
  • value_comp()–返回一个用于比较元素间的值的函数

multiset

#include

(multiset 容器和 set 容器有相同的成员函数,但是因为 multiset 可以保存重复元素,有些函数的表现会有些不同。和 set 容器中的成员函数表现不同的是:)
  • insert() 总是可以成功执行。当插入单个元素时,返回的迭代器指向插入的元素。当插入一段元素时,返回的迭代器指向插入的最后一个元素。
  • emplace() 和 emplace_hint() 总是成功。它们都指向创建的新元素。
  • find() 会返回和参数匹配的第一个元素的迭代器,如果都不匹配,则返回容器的结束迭代器。
  • equal_range() 返回一个包含迭代器的 pair 对象,它定义了一个和参数匹配的元素段。如果没有元素匹配的话,pair 的第一个成员是容器的结束迭代器;在这种情况下,第二个成员是比参数大的第一个元素,如果都没有的话,它也是容器的结束迭代器。
  • lower_bound() 返回和参数匹配的第一个元素的迭代器,如果没有匹配的元素,会返回容器的结束迭代器。返回的迭代器和 range() 返回的 pair 的第一个成员相同。
  • upper_bound() 返回的迭代器和 equal_range() 返回的 pair 的第二个成员相同。
  • count() 返回和参数匹配的元素的个数。

map

#include

(红黑树(平衡二叉树的一种)实现,map中的元素是自动按Key升序排序,所以不能对map用sort函数;)
  • map<int, string> mapStudent;
  • mapStudent[0]
  • mapStudent.insert(pair<int, string>(1, “student_one”)); (当map中有这个关键字时,insert操作是插入数据不了的)
  • mapStudent.insert(map<int, string>::value_type (1, “student_one”)); (当map中有这个关键字时,insert操作是插入数据不了的)
  • mapStudent[1] = “student_one”; (可插入原来没有的键值对,也可以覆盖以前该关键字对应的值)
  • size()
  • count() 返回0或1
  • find()
  • lower_bound() upper_bound() equal_range()
  • iterator erase(iterator it);//通过一个条目对象删除
  • iterator erase(iterator first,iterator last)//删除一个范围
  • size_type erase(const Key&key);//通过关键字删除
  • clear() 就相当于enumMap.erase(enumMap.begin(),enumMap.end());
  • begin()和end()
  • swap() 交换两个同类型map的内容,m1.swap(m2);

判断插入是否成功:

pair<map<int, string>::iterator, bool> Insert_Pair;

Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, "student_one"));

查找元素:

map<int, string>::iterator iter;  
iter = mapStudent.find(1);  
    if(iter != mapStudent.end())  
       cout<<"Find, the value is "<<iter->second<<endl;  
    else  
       cout<<"Do not Find"<<endl;  

反向遍历:

map<int, string>::reverse_iterator iter;  
    for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)  
        cout<<iter->first<<"  "<<iter->second<<endl;

multimap

#include

hash_set

#include <hash_set>

(使用hashtable数据结构的具有高效数据检索的关联容器,不提供反向迭代器,只有前向迭代器iterator和const_iterator,不允许插入重复的元素键值)

hash_multiset

hash_map

#include <hash_map>

(用哈希表(散列表)来实现。hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别)
  • hash_map<int, string> mymap;
  • hash_map(size_type n)
  • const_iterator find(const key_type& k) const
  • data_type& operator[](const key_type& k) 可插入可覆盖
  • insert()
  • erase

hash_multimap

heap

#include

#include

大顶堆,就每一个函数都加上第三个参数less<int>(),假如元素是int类型的;小顶堆,就每一个函数都加上第三个参数greater<int>(),假如元素是int类型的,一直加上,一直一致。
  • make_heap(_First, _Last, _Comp):建立堆(要么大顶堆,要么小顶堆)
  • push_heap( ): 在堆中添加元素
  • pop_heap( ): 在堆中删除元素
  • sort_heap( ): 堆排序
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void printHeap(vector<int> &v){
    for(vector<int>::iterator it= v.begin();it!=v.end();++it){
        cout<< *it <<" ";
    }
    cout<<"\n"<<endl;
}

int main()
{
    vector<int> min={10,30,22,6,15,9};

    //建立小顶堆
    make_heap(min.begin(), min.end(), greater<int>());
    printHeap(min);//6 10 9 30 15 22

    //插入元素
    min.push_back(20);
    push_heap(min.begin(),min.end(), greater<int>());//该算法前提:必须在堆的条件下
    printHeap(min); //6 10 9 30 15 22 20   仍为小顶堆

    //删除堆顶元素
    pop_heap(min.begin(),min.end(), greater<int>());
    printHeap(min);//9 10 20 30 15 22 6  不为小顶堆 这个pop_heap操作后,实际上是把堆顶元素放到了末尾
    min.pop_back();//这才彻底在底层vector数据容器中删除
    printHeap(min);//9 10 20 30 15 22  仍为小顶堆

    //堆排序  保持greater,小顶堆,得到的是降序
    sort_heap(min.begin(),min.end(), greater<int>());//试了用less,结果杂乱无章
    printHeap(min);//30 22 20 15 10 9 注意结果是降序的哦!!!其实是调用了很多次pop_heap(...,greater..),每一次都把小顶堆堆顶的元素往末尾放,没放一次end迭代器减1

    return 0;
}

Algorithm

find()

InputIterator find (InputIterator first, InputIterator last, const T& val);

比如

if(find(ideque.begin(), ideque.end(), 1) == ideque.end()){
...
}

sort()

sort(first_pointer,first_pointer+n,cmp)

比如

sort(begin,end,less<int>());

max() min()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL 总结(持续更新) 的相关文章

  • 如何从priority_queue中删除不在顶部的元素?

    在我的程序中 我需要从优先级队列中删除不在顶部的元素 可以吗 如果没有 请建议一种除了创建自己的堆之外的方法 标准priority queue
  • 哪个STL容器?

    我需要一个容器 不一定是 STL 容器 它可以让我轻松执行以下操作 在任意位置插入和移除元素 通过索引访问元素 以任意顺序迭代元素 I used 标准 列表 但它不会让我在任何位置插入 确实如此 但为此我必须迭代所有元素 然后在我想要的位置
  • 从函数返回 STL 向量 - 复制成本

    当您从函数返回 stl 向量时 vector
  • C++ 中模板和 STL 的缺点 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 使用 STL 或模板有什么缺点吗 是否存在不适合的情况 首先 如果它们可以帮助您解决问题 您应该使用它们 模板是 C 非常重要的一部分 并且多年
  • 通过值获取 std::queue 中元素的索引

    有没有一种简单的方法来获取元素在 a 中的位置std queue通过它在 C 中的值 例如 std queue
  • 迭代器后继者

    我想用另一个迭代器 同类 的后继者初始化一个迭代器 任意类型 以下代码适用于随机访问迭代器 但不适用于前向或双向迭代器 Iterator i j 1 一个简单的解决方法是 Iterator i j i 但这不起作用初始化语句for 循环的
  • C++ 中的映射的多个键

    我有一个表 其中的条目是这样的 Row Column1 Column2 Column3 Column4 1 0X0A 1 2 A 2 0X0B 2 2 B 3 0x0C 3 2 C 现在我想使用映射 以便我可以使用第 1 列或第 2 列作为
  • “向量迭代器+偏移量超出范围”断言有用吗?

    这个完美的程序在 Visual Studio 2013 的调试模式下失败了 include
  • 如何在 C++ 中将值从向量转换为映射?

    我想做这样的事情 有没有一个stl算法可以轻松做到这一点 for each auto aValue in aVector aMap aValue 1 如果您有一个对向量 其中对中的第一项将是映射的键 第二项将是与该键关联的值 您可以使用插入
  • 迭代 C++ 映射中的键

    有没有办法迭代键 而不是 C 映射对 地图是关联容器 因此 迭代器是一对key val 如果您只需要键 则可以忽略该对中的值部分 for std map
  • 使用 std::istream_iterator 限制 std::copy 的范围

    我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题 我在用着istream iterator读书floatss 或其他类型 来自 astd istream include
  • STL容器如何复制对象?

    我知道 STL 容器 比如vector添加对象时复制该对象 push back方法如下 void push back const T x 我很惊讶地发现它把该项目作为参考 我编写了一个示例程序来看看它是如何工作的 struct Foo Fo
  • 如何对多重映射中的键和值进行排序?

    建议使用任何方法对多重映射的键及其值进行排序 例如 输入 5 1 1 9 1 1 5 2 1 2 输出必须是 1 1 1 2 1 9 5 1 5 2 答案是emplace hint 伪代码如下所示 insert with hint M mm
  • 使用accumulate计算数组double[]平均值的函数

    它一定是最常见的函数 每个人在某处都有代码片段 但我实际上花了不少于 1 5 小时在 SO 以及其他 C 网站上搜索它 但还没有找到解决方案 我想计算 a 的平均值double array 使用函数 我想将数组作为函数传递给参考 有数百万个
  • 为什么这个 C++ STL 分配器不分配?

    我正在尝试编写一个派生自的自定义 STL 分配器std allocator 但不知何故所有的电话allocate 去基础班 我已将范围缩小到以下代码 template
  • const_iterator 和 iterator 有什么区别? [复制]

    这个问题在这里已经有答案了 这两者在 STL 内部的实现方面有什么区别 性能方面有什么区别 我想当我们以 只读方式 遍历向量时 我们更喜欢const iterator right 谢谢 没有性能差异 A const iterator是一个指
  • 是否有可能在 C++ 中获取 std::array 的子数组?

    我想做类似的事情 std array
  • 带有自定义分配器的 std::string

    所以我目前正在编写一个内存调试器 为此我需要 stl 容器对象来使用未跟踪的分配器 我的整个代码库中都散布了 std string 因此我将其键入以使用未跟踪的分配器 typedef std basic string
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进
  • std::accumulate 未按预期运行

    我使用 std accumulate 和测试代码得到了意外的结果 我正在尝试将一个大的双精度向量相加 但由于某种原因该值溢出 include

随机推荐

  • LeetCode岛屿问题通用解决模板

    文章目录 前言第一题 xff1a 求岛屿的周长模板整理遍历方向确定边界重复遍历问题处理 模板解第一题第二题 xff1a 求岛屿数量第三题 xff1a 岛屿的最大面积第四题 xff1a 统计子岛屿第五题 xff1a 统计封闭岛屿的数目第六题
  • 第十四篇,STM32的CAN总线通信

    1 CAN总线的概念 CAN指的是控制器局域网网络 Controller Area Network xff0c 由德国博世汽车电子厂商开发出来 CAN使用差分信号 xff0c 具有较强的抗干扰能力和传输稳定性 CAN属于多主通信 xff0c
  • OpenCV图像处理学习十九,像素重映射cv::remap

    一 像素重映射概念 重映射就是把输入图像中各个像素按照制定的规则顺序映射到另外一张图像的对应位置上去 xff0c 形成一张新的图像 二 像素映射API函数接口 cv remap xff08 InputArray src 输入图像 Outpu
  • OpenCV图像处理学习二十一,直方图比较方法

    一 直方图比较 直方图比较是对输入的两张图像进行计算得到直方图H1与H2 xff0c 归一化到相同的尺度空间 xff0c 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度 xff08 每张图像都有唯一的直方图与之对应 xff0
  • 嵌入式FreeRTOS学习九,任务链表的构成,TICK时间中断和任务状态切换调度

    一 tskTaskControlBlock 函数结构体 在tskTaskControlBlock 任务控制块结构体中 xff0c 其中有任务状态链表和事件链表两个链表成员 xff0c 首先介绍任务状态链表这个结构 xff0c 这个链表通常用
  • SOAP传输协议

    一 HTTP传输协议 超文本传输协议 xff08 HyperText Transfer Protocol xff0c 缩写 xff1a HTTP xff09 xff0c 它是基于请求 响应的模式协议 xff0c 客户端发出请求 xff0c
  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x
  • gsoap工具生成onvif设备搜索(remotediscovery)代码框架

    什么是gsoap工具 xff1f gSOAP 提供了两个工具来方便开发人员使用 C C 43 43 语言快速开发Web 服务应用 xff0c 通过 gSOAP 提供的这两个工具 xff0c 开发人员可以快速生成服务端与客户端代码框架 xff
  • Latex之给字符上加横线、波浪等

    Latex 前几天想在 x x x 上加波浪号 xff0c 一时间忘记怎么打 xff0c 现在记录下来 xff0c 以后好查阅 加 号 xff1a hat x 加横线 xff1a overline x 加宽 xff1a widehat x
  • 数据结构笔记-2(线性表)

    线性表 2 1 线性表 1 定义 是零个或多个具有相同类型的数据元素的有序数列 xff1b xff08 长度等于零的线性表为空表 xff09 非空线性表通常记为 xff1a L xff1d a 1 xff0c a 2 xff0c xff0c
  • 数据结构-6(图)

    图 图的逻辑结构 图的定义 xff1a 图是由顶点的有穷非空集合和顶点之间边的集合组成 xff0c 通常表示为 xff1a G 61 V xff0c E 其中 xff1a G表示一个图 xff0c V是图G中顶点的集合 xff0c E是图G
  • 【leetcode常见面试题】螺旋矩阵解题思路

    文章目录 螺旋矩阵解题思路先找行进路线找每条路线的结束位置再找每条路线的结束位置模拟行走 螺旋矩阵 II总结 螺旋矩阵 解题思路 本题可以采用模拟的方式 xff0c 设4种行走方向 xff0c 如下图 xff1a 先找行进路线 4个方向的行
  • C++面向对象程序设计学习心得

    C 43 43 面向对象程序设计学习心得 经过几周c 43 43 面向对象程序设计的学习 xff0c 对面向对象程序设计有了一些了解 递归 简单地讲 xff0c 递归就是程序直接或间接调用本身的编程技巧 xff0c 通过把一个不能或不好解决
  • STL学习心得

    STL概述 STL组件 1 容器 xff08 Container xff09 xff0d 管理某类对象的集合 2 迭代器 xff08 Iterator xff09 xff0d 在对象集合上进行遍历 xff08 注意 xff1a 这些集合可能
  • 安装nodejs和vue出现问题

    安装nodejs国内镜像时报错 npm install g cnpm registry 61 https registry npm taobao org不知道这是啥错误 xff0c 怎么改啊 xff1f 安装vue 从官网点击下载 下载后点
  • Jetson nano/nx通过网线连接电脑实现远程控制

    Jetson nano nx通过网线连接电脑实现远程控制 摘要1 nano nx桌面共享设置2 安装dconf editor解除加密3 自启VNC server4 网络共享5 获取IP地址6 安装PuTTy7 安装VNC Viewwer8
  • 一文解决MySQL突击面试,关键知识点总结

    文章目录 MySQL重要知识点回顾一 索引1 为什么需要索引2 索引的结构3 避免索引失效3 1 联合索引不满足最左匹配原则3 2 隐式转换3 3 like查询3 4 索引列存在运算或者使用函数3 5 优化器 4 执行计划4 1 type4
  • 51单片机应用篇-- --数码管60秒计时,独立按键可调

    开篇先说一句废话 本旺名字叫萨摩耶 xff0c xff0c Please 叫我旺财 xff0c xff0c xff0c 哈哈 xff0c 招财进宝嘛 xff01 缘由 本来按照我的学习计划 xff0c 我现在应该是单片机的学习过程 xff0
  • 【ESP32+freeRTOS学习笔记之“ESP32环境下使用freeRTOS的特性分析(3-多核环境下的调度)”】

    目录 1 不同核心上分别调度2 tick中断3 关于抢占4 关于同优级的任务按时间片调度5 空闲任务6 调度程序暂停7 启动和终止8 禁用中断9 总结 Vanilla FreeRTOS调度器是具有时间切片的固定优先级抢占调度器 xff0c
  • C++ STL 总结(持续更新)

    因为机试需要用c 43 43 xff0c 暴风吸入式学习 xff08 套用 xff09 它的模板 xff0c 发现还真的挺好用的 xff0c 总结一下 时间紧急 xff0c 取自各个网上的博客 xff0c 没来得及仔细整理 xff0c 都给