C++ STL概述

2023-11-19

STL就是封装好的一些数据结构以及一些算法

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

Standard Template Library

  • 即标准模板库,简称STL,是C++内置的一些库。客观的讲,竞赛手所使用的「C++」,不如称为「C+STL」。

  • 何为模板?首先我们引入重载函数的概念,当我们要实现一个功能,与类型无关的时候,函数名可以重复(即参数列表且仅有参数列表不同),我们可以实现一些同名函数。不过这样依然容易造成代码冗余,进而有了模板的概念:模板可以作用于函数与结构体(类)上,表示函数参数列表/结构体(类)类型列表可以变化。简单来说,我们可以用更少的代码实现一类函数,这些函数的功能仅与类型无关。特别的,这些函数不妨称作「模板函数」,而这些类、结构体,不妨称作「模板类」。STL则包含了这两类。

  • 关于头文件:

    #include<bits/stdc++.h>//万能头文件,包含了STL以及更多常用库

    using namespace std;//为了防止多用户的命名有冲突,将这些变量、类型、函数都放在命名空问中,作为区分
    //要访问一个namespace中的对象,使用域操作符(::)例如 std::cout<<“Hello World!”<<’\n’;
    //STL以及其他标准函数定义于std下,这句话的意思就是引入std下的所有对象命名
    //形式化的说,加入了这句话,就不需要std::cout<<’\n’而直接cout<<’\n’了

STL部件
总共有四个部分:「容器」、「算法」、「迭代器」、「函数」,四者关系如下图所示:
在这里插入图片描述

组件 描述
容器(Containers) 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms) 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators) 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。<br/>这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:

实例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   // 创建一个向量存储 int
   vector<int> vec; 
   int i;
   // 显示 vec 的原始大小
   cout << "vector size = " << vec.size() << endl;
   // 推入 5 个值到向量中
   for(i = 0; i < 5; i++){
      vec.push_back(i);
   }
   // 显示 vec 扩展后的大小
   cout << "extended vector size = " << vec.size() << endl;
   // 访问向量中的 5 个值
   for(i = 0; i < 5; i++){
      cout << "value of vec [" << i << "] = " << vec[i] << endl;
   }
   // 使用迭代器 iterator 访问值
   vector<int>::iterator v = vec.begin();
   while( v != vec.end()) {
      cout << "value of v = " << *v << endl;
      v++;
   }
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

vector size = 0
extended vector size = 5
value of vec [0] = 0
value of vec [1] = 1
value of vec [2] = 2
value of vec [3] = 3
value of vec [4] = 4
value of v = 0
value of v = 1
value of v = 2
value of v = 3
value of v = 4

关于上面实例中所使用的各种函数,有几点要注意:

  • push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。

  • size( ) 函数显示向量的大小。

  • begin( ) 函数返回一个指向向量开头的迭代器。

  • end( ) 函数返回一个指向向量末尾的迭代器。

C++ STL 之 vector 的 capacity 和 size 属性区别

size 是当前 vector 容器真实占用的大小,也就是容器当前拥有多少个容器。

capacity 是指在发生 realloc 前能允许的最大元素数,即预分配的内存空间。

当然,这两个属性分别对应两个方法:resize()reserve()

使用resize() 容器内的对象内存空间是真正存在的。

使用 reserve()仅仅只是修改了 capacity 的值,容器内的对象并没有真实的内存空间(空间是"野"的)。

此时切记使用[]操作符访问容器内的对象,很可能出现数组越界的问题。

下面用例子进行说明:

#include <iostream>
#include <vector>
using std::vector;
int main(void)
{
    vector<int> v;
    std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
    v.reserve(10);
    std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
    v.resize(10);
    v.push_back(0);
    std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;

    return 0;
}

运行结果为:(win 10 + VS2010)
在这里插入图片描述
注: 对于 reserve(10) 后接着直接使用 [] 访问越界报错(内存是野的),大家可以加一行代码试一下,这里没有贴出来。

这里直接用[]访问,vector 退化为数组,不会进行越界的判断。此时推荐使用 at(),会先进行越界检查。

相关引申:

针对 capacity 这个属性,STL 中的其他容器,如 list map set deque,由于这些容器的内存是散列分布的,因此不会发生类似 realloc() 的调用情况,因此我们可以认为 capacity 属性针对这些容器是没有意义的,因此设计时这些容器没有该属性。

在 STL 中,拥有 capacity 属性的容器只有 vector 和 string。

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

C++ STL概述 的相关文章

  • 如何使用 vim 更改文件的编码?

    我习惯使用 vim 修改文件的行结尾 file file file ASCII text with CRLF line terminators vim file set ff mac wq file file file ASCII text
  • Vim 和 snipMate(插件)- 添加新代码片段不起作用

    我正在尝试为我的 snipMate 插件创建一个新的片段 我使用一些名为 即 myfile endfile 的文件 所有 endfile 文件都应具有与 html 文件相同的 片段 所以我做了 cp html snippet endfile
  • vim e518:未知选项:

    我在 UNIX 系统上有一个文本文件 以下文本文件内容会产生问题 good ok line vi bad line ok ok line 所以如果我运行 vim test txt 我收到以下错误 test txt 3L 39C Error
  • 我可以在 VIM 或 Perl 中替换单个正则表达式中的多个项目吗?

    假设我有字符串 The Quick Brown Fox Jumps Over the Lazy Dog 我可以用一个正则表达式将其更改为 The Slow Brown Fox Jumps Over the Energy Dog 吗 目前 我
  • 有没有办法在 (g)Vim 中突出显示多个搜索?

    我想在 Vim gVim 中搜索多个字符串 并用不同的颜色突出显示它们 有没有办法用开箱即用的 Vim 或插件来做到这一点 在 vim 编辑器中突出显示多个单词有两种简单的方法 进入搜索模式 即输入 然后输入 v后面是您要搜索的单词 以 分
  • 如何在 vim 中为 cscope 输出添加颜色?

    我使用的是 vim 7 4 vim 中的 cscope 输出全是白色 可以变得更加丰富多彩吗 我尝试了cecscope 它使用quickfix给vim带来颜色 但它的输出不适合小屏幕 使用笔记本电脑时它没有那么有用 那么还有其他方法可以为
  • 在 vim 中设置文本宽度而不覆盖特定于文件类型的内容

    我希望 vim 中默认的文本宽度为 80 但如果特定文件类型有自己的文本宽度 特别是 gitcommit 其中 tw 72 我希望 vim 尊重该宽度 在我的 vimrc 中 我有以下行 set tw 80 我也尝试过 setlocal t
  • Vim 重复点(“.”)命令缓冲区?

    我真的很喜欢 YankRing 的行为 它让我可以访问我最近完成的几件事y固定或d已删除或c不假思索地被吊死了 然而 这样的补充功能对于 重复命令 最常见的是当我键入我真正想重复的内容时 然后按x清理一些东西 通常 可以通过视觉模式拉动我刚
  • 如何在 VIm 和终端中始终拥有相同的当前目录?

    我希望我的终端当前目录跟随我的 VIM 目录 Example 在终端中 gt pwd gt Users rege gt vim 然后在VIM中 cd Users rege project
  • 如何在 Vim 中特定列的所有行中插入特定字符?

    Dates Name Date Battle of the Plains of Abraham September 13 1759 Proclamation Act October 07 1763 Stamp Act March 22 17
  • Vim 与 tmux 相得益彰

    NERDTree 在 tmux 会话中出现问题 如图所示 当窗口被分割时也存在同样的问题 但现在我正在使用电源线 https github com Lokaltog powerline这次 Vim 状态在 tmux 中变得混乱 在图中看到状
  • VIM 分块插入

    我想在 VIM 中选定的文本块的开头插入一个哈希 Ruby 注释 我在可视模式下选择了线条 但如何对所有线条执行相同的操作 您有两个主要选择 在块视觉模式中选择 ctrl v 然后使用I沿着整个块的左侧插入相同的东西 相似地A追加 看分块运
  • 如何中断一个花费太多时间的 Vim 命令?

    有时 Vim 命令需要花费太多时间来执行 典型示例 gf通过网络发送具有巨大路径的命令 最多可能需要 30 秒才能结束 我想在执行过程中中断它 有没有办法取消命令执行并返回到正常模式 无需杀死 Vim 并重新启动 您可以中断它发送 SIGI
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • vim 按语法高亮类型搜索

    我正在将 i18n 添加到现有项目 Web 应用程序 这涉及到用对 i18n 库的调用来替换静态文本的每一位 如果能够搜索该文本 而不是依靠语法突出显示来直观地识别它 将会很方便 在 vim 中 是否可以在文件中搜索特定突出显示类型的出现
  • Vim 和 Mac:如何在不使用 pbcopy 的情况下复制到剪贴板

    我有一个同时支持剪贴板和 xterm clipboard 的 vim 版本 然而 y or y不要复制到系统剪贴板 我知道我可以使用 w pbcopy 甚至为其创建快捷方式 但我真的想要标准方式 我也看到了 fakeclip 但希望找到一个
  • 如何从 vim 命令行交互运行 vim 脚本?

    有没有办法从以下位置运行这些脚本 命令行只需敲几下键 在过去的几个月里 我构建了一系列充满 vim 命令的文件 为我的项目自动生成样板代码 它让我工作得更快 但是 我知道如何运行这些脚本的唯一方法是将它们分配给 vimrc 我只能重新映射这
  • Vim:使用制表符缩进,使用空格对齐

    我已经阅读了几个问题和答案 Vim 使用制表符缩进 使用空格与 C 源文件对齐 https stackoverflow com questions 8493705 vim use tabs for indentation spaces fo
  • 改变 vim 'gutter' 颜色

    请参阅下面我如何配置 vim 的屏幕截图 gutter 即出现 和 符号的位置 使用 vim 的这个令人惊叹的 sublime text 端口显示我的 git 状态 https github com airblade vim gitgutt
  • 自定义 Vim HTML 语法

    我有一个脚本可以读取 HTML 文件并替换出现的 foo 具有 Perl 设置的值 像这样的东西 span class hi mom span 会在浏览器中产生类似这样的内容 span class classyclass Hello Wor

随机推荐

  • 键盘的hid描述符例子

    譬如有如下的Report Descriptor 譬如有如下的Report Descriptor C C code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
  • 【无标题】乌邦图基础

    1 gt ubuntu的操作 图形界面 当我们ubuntu开启时 会自动进入桌面 桌面拥有很多图标 可以直接通过鼠标点击来完成操作 只适用于不走开发型的纯小白 成本很高 字符界面 没有其他任何的图案和标志 只有黑漆漆的对话框 和冰冷的字眼
  • 基于深度学习实现实时视频目标检测

    前言 实时视频目标检测是计算机视觉领域的研究热点之一 其应用场景包括智能监控 自动驾驶 机器人视觉等多个领域 深度学习技术的快速发展使得实时视频目标检测变得更加可行和准确 本文提出一种基于深度学习实现的实时视频目标检测系统 使用Python
  • 服务器运行python代码报错:intall python Extension

    当我安装时候又报错 WARNING Retrying Retry total 4 connect None read None redirect None status None after connection broken by New
  • 学生管理系统(C语言)

    说明 本程序的基本功能由单链表实现 满足基本的增删改查等功能 包括对文件的读写 由于测试数据较少 项目的鲁棒性可能不是很好 基本功能 退出 输入成绩 计算每名学生加权平均成绩 计算每门课程平均分 按分数降序排列 按学号升序排序 按姓名在字典
  • 如何通过手机拍照生成三维模型

    使用过易模的用户都知道 易模是通过手机扫描拍摄来进行建模的 而手机拍照建模是除扫描拍摄建模方式外迭代升级的一种全新的建模方式 使用手机拍照来进行建模 我们只需要按照要求拍摄并且上传所需建模物体的照片 系统就会自动生成我们所拍摄的物体模型 目
  • Jenkins免密登录gitlab拉取代码

    折腾了一下午 终于弄好了 网上很多博客写的都不清楚 所以记录一下 环境说明 服务器 说明 192 168 199 1 Jenkins 192 168 199 2 gitlab 操作步骤 1 生成公匙 在jenkins服务器执行 ssh ke
  • 2022年华中杯A题(暂时做完第一小问,附完整Python源码)

    目的 虽然比赛时间过去了 但还是可以拿来练一练优化问题的解决 加强自己对于优化算法的巩固 文章目录 目录 目的 前言 一 题目 二 思路 1 第一小题 分批算法 三 程序 1 计算相似度的函数 2 分批算法主要部分 初始化 1 首先生成想要
  • leetcode刷题之字符串处理

    3 Longest Substring Without Repeating Characters Given a string find the length of the longest substring without repeati
  • java common-lang,Maven包错误:org.apache.commons-lang不存在(Java)

    I m using MyEclipse to develop a really simple Java Struts project Everything was working fine until I wanted to use the
  • 面试常考手写代码之--二叉树层次遍历(BFS)

    struct BTNode s int value BTNode s pLeft BTNode s pRight BTNode void BFS BTNode pRoot if pRoot NULL return std deque
  • Python并发编程【(一)理论】:多线程thread、多进程Process、协程Coroutine(async await)

    Python对并发编程的支持 多线程 threading 利用CPU和IO可以同时执行的原理 让CPU不会干巴巴等待IO完成 多进程 multiprocessing 利用多核CPU的能力 真正的并行执行任务 异步IO asyncio 在单线
  • RuntimeError: Error(s) in loading state_dict for ..:Missing key(s) in state_dict: …Unexpected key...

    原因 预训练权重层数的键值与新构建的模型中的权重层数名称不吻合 Checkpoint里面的模型是在双卡上训练的 保存的key前面都多一个module 解决 model torch nn DataParallel model device i
  • 学编程需要的电脑配置

    Java语言 普通PC机可以参考下方的这个配置哦 操作系统 Win10 或 Mac 优先Win10 内存 推荐16G及以上 8G也OK 肯定是越大越好 CPU Intel i5及以上 AMD谨慎考虑 硬盘 512G及以上 含固态硬盘优先 品
  • Exception has occurred: TypeError func must be a callable or a textual reference to one

    这是python定时器apschedurler的scheduler add job iotmain cron hour 7 minute 00 语句里面 调用的方法iotmain 不能带 改写为 scheduler add job iotm
  • rancher使用说明

    一 登录rancher rancher 内网地址 https 10 1 119 12 9443 login 用户名 admin 密码 admin 进入默认项目的工作负载页面 二 部署服务 部署服务 进入按钮 部署服务 部署页面 2 1 各部
  • mysql域名配置_bind+mysql域名解析的简单配置

    虽然不是干运维的 但在IT江湖打酱油也难免受到高人的影响 所以在很早就听说bind可以和数据结合使用 一直都没有时间去研究 今天恰好一个同事问到bind安装的问题 就顺便研究了一下 下面将我的操作过程共享个各位 期间查找了不少网络上的资料
  • 为分布式做准备吧——分布式服务架构设计概述

    文章目录 分布式服务框架设计架构原理 通信框架 长连接还是短链接 BIO还是NIO 序列化与反序列化 协议栈 服务路由 基于服务注册中心的订阅发布 集群容错 服务降级 分布式消息跟踪 分布式服务框架设计架构原理 通常 分布式服务框架的架构可
  • 集成unittest与html测试报告

    常用断言 self assertTrue self assertEqual 集成HtmlTestRunner生成测试报告 testcase unittest TestSuite testcase addTests unittest Test
  • C++ STL概述

    STL就是封装好的一些数据结构以及一些算法 C STL 标准模板库 是一套功能强大的 C 模板类 提供了通用的模板类和函数 这些模板类和函数可以实现多种流行和常用的算法和数据结构 如向量 链表 队列 栈 Standard Template