C++ STL容器:序列式容器-数组string,vector,array,bitset
摘要:
CC++ STL(Standard Template Library,标准模板库)在C++编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C++程序的开发效率和代码质量。
STL 容器 分为 2 大类 , 分别是“序列式容器” 和“关联式容器 ”。
- 序列式容器:每个元素都有固定位置,取决于插入时机和地点,其底层为线性序列的数据结构,里面存储的是元素本身。
- 关联式容器:元素位置取决于特定的排序准则,和插入顺序无关,其里面存储的是< key , value >结构的键值对,在数据检索时比序列式容器效率更高。
本系列博文将详细介绍C++STL的各种容器的特性优缺点,以及其常用算法方法等。本文介绍的是序列式容器-数组string,vector,array,bitset。
(开发环境:VScode,C++17)
关键词: C++,STL,数据存储,数据类型,数组,array,string,vector,bitset
声明:
本文作者原创,转载请附上文章出处与本文链接。
文章目录
- 摘要:
- 正文:
- string
- 常用函数:
- 使用例子:
- array
- 常用函数:
- 使用例子:
- vector
- 常用函数:
- 使用例子:
- bitset
- 常用函数:
- 使用例子:
- 推荐阅读
正文:
string
string类本不是STL的容器,但是它与STL容器有着很多相似的操作,因此,把string放在这里一起进行介绍。C++中的string类相当于是字符数组,但是其更方便于我们的操作,而且不需要在输入之前初始化字符数组的容量,节省空间。(有需要更深入了解数据结构数组的,可看同专栏下数据结构分支)
常用函数:
- front():返回
string第一个元素。 - back():返回
string最后一个元素。 - insert():在指定位置索引插入字符。
- erase():从指定索引处开始删除字符。
- replace():从索引处开始替换字符。
- append():在字符串尾部拼接上字符串。
- size():返回
string包含的元素个数。 - compare():比较两个字符串,如果
str小于str2,结果为负;相等则为0;大于则为正 。 - find():从前往后找对应的字符串,若找到,返回首字母下标。
- count():计算字符串中对应字符出现的次数。
- substr():返回从索引处开始的对应个数元素组成的字符串 。
- empty():判断字符串是否为空。
使用例子:
#include <iostream>
#include <string> int main()
{std::string str = "Hello, World!";// front 和 backstd::cout << "First character: " << str.front() << std::endl;std::cout << "Last character: " << str.back() << std::endl;// insertstr.insert(7, "Beautiful "); // 在索引7处插入"Beautiful "std::cout << "After insert: " << str << std::endl;// erasestr.erase(7, 9); // 从索引7开始删除9个字符(这里实际只有8个字符可删除)std::cout << "After erase: " << str << std::endl; // replacestr.replace(7, 5, "Great"); // 从索引7开始替换5个字符为"Great"std::cout << "After replace: " << str << std::endl;// appendstr.append(" and everyone!");std::cout << "After append: " << str << std::endl;// sizestd::cout << "Size of string: " << str.size() << std::endl;// comparestd::string str2 = "Hello, everyone!";int result = str.compare(str2); // 比较两个字符串std::cout << "Compare result: " << result << std::endl; // findsize_t pos = str.find("Great");std::cout << "Position of 'Great': " << pos << std::endl;// countsize_t count = str.count('o'); // 计算字符'o'出现的次数std::cout << "Number of 'o's: " << count << std::endl; // substrstd::string sub = str.substr(7, 5); // 从索引7开始获取长度为5的子字符串std::cout << "Substring: " << sub << std::endl;// emptyif (str.empty()) {std::cout << "String is empty." << std::endl;}else {std::cout << "String is not empty." << std::endl;}return 0;
}
array
C++ STL(Standard Template Library,标准模板库)中的
array是一个固定大小的顺序容器,它支持随机访问。与vector不同,array的大小在编译时就必须确定,且之后不可改变。这意味着array提供了比vector更高的性能,因为它不需要在运行时动态分配内存或管理内存大小的变化。然而,这也意味着array的灵活性较低,不适用于需要动态改变大小的场景。
常用函数:
- size():返回容器中的元素数量。
- empty():如果容器为空,则返回
true。 - begin(), end():返回指向容器第一个元素和最后一个元素之后位置的迭代器。
- at(size_t pos):访问指定位置的元素,如果位置超出范围,则抛出
std::out_of_range异常。 - operator[]:可以使用下标操作符
[]来访问array中的元素。
使用例子:
#include <iostream>
#include <array>int main()
{ std::array<int, 5> myArray = {1, 2, 3, 4, 5};// 遍历并打印数组for (int i = 0; i < myArray.size(); ++i) {std::cout << myArray[i] << " ";}std::cout << std::endl;// 使用at访问元素try {std::cout << "Element at position 3: " << myArray.at(3) << std::endl;}catch (const std::out_of_range& e) {std::cout << "Out of range error: " << e.what() << std::endl;}return 0;
}
vector
一句话来说,vector 就是能够动态调整大小的 array。和 array 一样,vector 使用连续内存空间来保存元素,这意味着其元素可以用普通指针的++和–操作来访问;不同于 array 的是,其存储空间可以自动调整。
常用函数:
- size():返回容器中元素的数量。
- empty():如果容器为空,则返回
true。 - push_back(const T& value):在容器的末尾添加一个元素。
- pop_back():移除容器末尾的元素。
- begin(), end():返回指向容器第一个元素和最后一个元素之后位置的迭代器。
- insert(iterator pos, const T& value):在指定位置插入一个元素,并返回指向新插入元素的迭代器。
- erase(iterator pos):移除指定位置的元素,并返回指向被移除元素之后位置的迭代器。
- clear():移除容器中的所有元素。
使用例子:
#include <iostream>
#include <vector>int main()
{std::vector<int> myVector = {1, 2, 3, 4, 5};// 在末尾添加元素myVector.push_back(6);// 遍历并打印vectorfor (int i = 0; i < myVector.size(); ++i) {std::cout << myVector[i] << " ";}std::cout << std::endl;// 在指定位置插入元素myVector.insert(myVector.begin() + 2, 99); // 在第三个位置插入99// 再次遍历并打印vectorfor (int num : myVector) { // 使用范围for循环std::cout << num << " ";}std::cout << std::endl;return 0;
}
bitset
C++ STL(Standard Template Library,标准模板库)中的
bitset是一个固定大小的位序列,其中每个位可以独立地设置为0或1,bitset容器相当于是01数组。bitset是一个模板类,通常用于处理位操作,如设置、清除、翻转、测试位,以及执行位计数和位查找等操作。bitset特别适用于需要精确控制位操作的场景,如权限管理、状态标记等。
常用函数:
- test(size_t pos):测试在位置
pos上的位是否为1。 - set(size_t pos, bool val = true):将位置
pos上的位设置为val(默认为true)。 - reset(size_t pos):将位置
pos上的位设置为0。 - flip(size_t pos):翻转位置
pos上的位。 - to_ulong()
和to_ullong():将bitset的内容转换为unsigned long或unsigned long long类型(注意,这可能会导致数据丢失,如果bitset的大小超过了目标类型的位数)。 - size():返回
bitset中位的数量。 - count():返回
bitset中设置为1的位的数量。 - any():如果
bitset中至少有一个位被设置为1,则返回true。 - none():如果
bitset中没有位被设置为1,则返回true。 - all():如果
bitset中的所有位都被设置为1,则返回true。
使用例子:
#include <iostream>
#include <bitset>int main()
{std::bitset<8> myBitset("10101010");// 测试并打印特定位std::cout << "Bit 3: " << myBitset.test(3) << std::endl; // 输出1,因为第3位是1(从0开始计数)// 翻转特定位myBitset.flip(3);std::cout << "After flipping bit 3: " << myBitset << std::endl; // 输出01101010// 设置特定位myBitset.set(5);std::cout << "After setting bit 5: " << myBitset << std::endl; // 输出01101110// 重置特定位myBitset.reset(5);std::cout << "After resetting bit 5: " << myBitset << std::endl; // 输出01101010// 输出1的个数std::cout << "Number of 1s: " << myBitset.count() << std::endl; // 输出4return 0;
}
推荐阅读
博客主页:https://blog.csdn.net/weixin_45068267
(客官逛一逛,有许多其它有趣的专栏博文)
C/C++专栏:https://blog.csdn.net/weixin_45068267/category_12268204.html
(内含其它STL容器使用及对应的数据结构实现)
相关文章:
C++ STL容器:序列式容器-数组string,vector,array,bitset
摘要: CC STL(Standard Template Library,标准模板库)在C编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...
ElementUI样式优化:el-input修改样式、el-table 修改表头样式、斑马格样式、修改滚动条样式、
效果图: 1、改变日期时间组件的字体颜色背景 .form-class ::v-deep .el-date-editor { border: 1px solid #326AFF; background: #04308D !important; } .form-class ::v-deep .el-date-editor.el-input__wrapper { box-shadow: 0 0 0 0px #326AFF inset; } // 输入…...
大数据面试题之Spark(6)
Spark输出文件的个数,如何合并小文件? Spark的driver是怎么驱动作业流程的? Spark SQL的劣势? 介绍下Spark Streaming和Structed Streaming Spark为什么比Hadoop速度快? DAG划分Spark源码实现? Spark Streaming的双流join的过程,怎么做的? …...
SpringSecurity中文文档(Servlet Anonymous Authentication)
Anonymous Authentication Overview 通常认为采用“默认拒绝”立场是良好的安全实践,您明确指定允许的内容并拒绝其他所有内容。定义未经身份验证的用户可以访问的内容是类似的情况,特别是对于 Web 应用程序。许多网站要求用户必须经过身份验证才能访问…...
【Spring Boot 事务管理】
Spring Boot 事务管理 一、Spring Boot中的事务管理1.声明式事务管理Transactional注解基本使用配置选项 2.编程式事务管理TransactionTemplatePlatformTransactionManager 二、Transactional注解深入1.基本使用基本属性 2.传播行为3.隔离级别4.事务超时设置5.回滚规则 三、事务…...
【C++】C++指针在线程中调用与受保护内存空间读取方法
引言 在C的多线程编程中,正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时,对受保护内存空间的访问必须谨慎处理,以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…...
安全隔离上网的有效途径:沙箱
在数字化浪潮日益汹涌的今天,网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制,为企业和个人提供了一种在享受网络便利的同时,保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网,从而为用户提…...
jenkins下后台运行链接Jenkins服务脚本方法
为了编写一个用于在后台运行 Jenkins agent 的批处理脚本,你可以使用 start 命令来启动 Java 进程并将其设置为在后台运行。以下是一个示例批处理脚本 run_agent.bat: bat echo off setlocalREM Set the path to the Jenkins agent JAR file set AGENT…...
宠物空气净化器哪个品牌性价比高?宠物空气净器Top3品牌推荐
养猫确实给家庭带来了无尽的欢乐,但猫毛无处不在的问题确实让不少猫主人感到头疼。不论是长毛猫还是短毛猫,它们掉落的浮毛飘浮在空气中,不仅影响家居环境的整洁度,还可能成为过敏的源头。因此,如何高效地处理这些猫浮…...
苏州大厂面试题JAVA 面试集
基础知识1、强引用、软引用、弱引用、幻象引用有什么区别?(java基础) 答案参考:https://time.geekbang.org/column/article/6970 2、 对比Hashtable、HashMap、TreeMap有什么不同?(数据结构) 答案参考:https://time.geekbang.org/column/article/8053 3、一个线程调用两次…...
数据库取出来的日期格式是数组格式,序列化日期格式
序列化前,如图所示: 解决方式,序列化日期(localdatetime)格式 步骤一、添加序列化类 package com.abliner.test.common.configure;import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fas…...
【Android】创建一个可以在屏幕上拖动的悬浮窗
项目需求 在界面上创建一个悬浮窗,可以自由的移动这个悬浮窗 需求解决 1.添加权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>2.请求权限 从 Android 6.0 (API 23) 开始,应用需要动态请求显示悬浮窗…...
SPI NAND、SD NAND和eMMC对比—MK米客方德
目录 1. 容量: 2.封装类型: 3.速度: 4.性能: 5.寿命: 6. 使用方式: 7. 其他优缺点: 8.常见应用场景: 1. 容量: SPI NAND通常提供从几百MB到几GB的存储容量。 SD NAND的容量覆盖范围比SPI NAND更广,从几GB到几十GB不等。 eMMC的容量范围更大&a…...
“深入解析:YUM仓库、RPM包与源码编译——Linux软件安装方式全面对比“
目录 YUM 仓库安装 概念: 优点: 缺点: RPM 包安装 概念: 优点: 缺点: 源码编译安装 概念: 优点: 缺点: 三者区别 YUM 仓库安装 概念: YUM&…...
中电金信:银行业私有云何去何从
2009年,云计算开始从概念走向实践。在这一年,Gartner在预测2010十大发展趋势中,将云计算列在榜首。在这之后,谷歌、亚马逊、IBM等科技巨头纷纷加码对云计算的研发投入。2010年正式迎来云计算时代,这一年也被定为“云元…...
Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。
Windows系统:Adobe Acrobat Pro或者Adobe Acrobat Reader首选项-一般-取消在同一窗口的新标签中打开文档(需要重启)的对勾,点击确定,彻底关闭后重启,这样打开的每一个PDF文件对应的是一个窗口,并…...
从0开始学习pyspark--pyspark的数据读取[第4节]
在PySpark中,读取文件型数据是一个常见的操作,Spark支持多种数据格式,如CSV、JSON、Parquet、Avro等。以下是一些常用的方法来读取不同格式的文件数据。 读取文本型数据 读取CSV文件: 使用spark.read.csv方法读取CSV文件,可以通…...
极速升级:MacOS系统中Pip源的切换指南
极速升级:MacOS系统中Pip源的切换指南 在MacOS系统中,Python的包管理工具Pip是我们管理和安装Python库的得力助手。然而,默认的Pip源在国外,对于国内用户来说,访问速度可能较慢。因此,更换Pip源以提高下载…...
服务器的分类,主流服务器的应用场景
一、服务器分类 服务器可以按应用层次、体系架构、用途、外形等进行分类。以下是详细说明: 按应用层次分类 入门级服务器:这些服务器一般用于小型企业或部门的简单任务,如文件共享和打印服务。工作组级服务器:适用于中小型企业&…...
Objects and Classes (对象和类)
Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes (使用类) Ref…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
后端下载限速(redis记录实时并发,bucket4j动态限速)
✅ 使用 Redis 记录 所有用户的实时并发下载数✅ 使用 Bucket4j 实现 全局下载速率限制(动态)✅ 支持 动态调整限速策略✅ 下载接口安全、稳定、可监控 🧩 整体架构概览 模块功能Redis存储全局并发数和带宽令牌桶状态Bucket4j Redis分布式限…...
无头浏览器技术:Python爬虫如何精准模拟搜索点击
1. 无头浏览器技术概述 1.1 什么是无头浏览器? 无头浏览器是一种没有图形用户界面(GUI)的浏览器,它通过程序控制浏览器内核(如Chromium、Firefox)执行页面加载、JavaScript渲染、表单提交等操作。由于不渲…...
