当前位置: 首页 > news >正文

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数据存储数据类型数组arraystringvectorbitset

声明:本文作者原创,转载请附上文章出处与本文链接。

文章目录

      • 摘要:
      • 正文:
        • 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 longunsigned 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

摘要&#xff1a; CC STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;在C编程中的重要性不容忽视&#xff0c;STL提供了一系列容器、迭代器、算法和函数对象&#xff0c;这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...

ElementUI样式优化:el-input修改样式、el-table 修改表头样式、斑马格样式、修改滚动条样式、

效果图&#xff1a; 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输出文件的个数&#xff0c;如何合并小文件? Spark的driver是怎么驱动作业流程的? Spark SQL的劣势? 介绍下Spark Streaming和Structed Streaming Spark为什么比Hadoop速度快? DAG划分Spark源码实现? Spark Streaming的双流join的过程&#xff0c;怎么做的? …...

SpringSecurity中文文档(Servlet Anonymous Authentication)

Anonymous Authentication Overview 通常认为采用“默认拒绝”立场是良好的安全实践&#xff0c;您明确指定允许的内容并拒绝其他所有内容。定义未经身份验证的用户可以访问的内容是类似的情况&#xff0c;特别是对于 Web 应用程序。许多网站要求用户必须经过身份验证才能访问…...

【Spring Boot 事务管理】

Spring Boot 事务管理 一、Spring Boot中的事务管理1.声明式事务管理Transactional注解基本使用配置选项 2.编程式事务管理TransactionTemplatePlatformTransactionManager 二、Transactional注解深入1.基本使用基本属性 2.传播行为3.隔离级别4.事务超时设置5.回滚规则 三、事务…...

【C++】C++指针在线程中调用与受保护内存空间读取方法

引言 在C的多线程编程中&#xff0c;正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时&#xff0c;对受保护内存空间的访问必须谨慎处理&#xff0c;以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…...

安全隔离上网的有效途径:沙箱

在数字化浪潮日益汹涌的今天&#xff0c;网络安全成为了不可忽视的重要议题。沙箱技术作为一种高效的隔离机制&#xff0c;为企业和个人提供了一种在享受网络便利的同时&#xff0c;保障系统安全的解决方案。本文旨在深入探讨沙箱技术如何做到隔离上网&#xff0c;从而为用户提…...

jenkins下后台运行链接Jenkins服务脚本方法

为了编写一个用于在后台运行 Jenkins agent 的批处理脚本&#xff0c;你可以使用 start 命令来启动 Java 进程并将其设置为在后台运行。以下是一个示例批处理脚本 run_agent.bat&#xff1a; bat echo off setlocalREM Set the path to the Jenkins agent JAR file set AGENT…...

宠物空气净化器哪个品牌性价比高?宠物空气净器Top3品牌推荐

养猫确实给家庭带来了无尽的欢乐&#xff0c;但猫毛无处不在的问题确实让不少猫主人感到头疼。不论是长毛猫还是短毛猫&#xff0c;它们掉落的浮毛飘浮在空气中&#xff0c;不仅影响家居环境的整洁度&#xff0c;还可能成为过敏的源头。因此&#xff0c;如何高效地处理这些猫浮…...

苏州大厂面试题JAVA 面试集

基础知识1、强引用、软引用、弱引用、幻象引用有什么区别?(java基础) 答案参考:https://time.geekbang.org/column/article/6970 2、 对比Hashtable、HashMap、TreeMap有什么不同?(数据结构) 答案参考:https://time.geekbang.org/column/article/8053 3、一个线程调用两次…...

数据库取出来的日期格式是数组格式,序列化日期格式

序列化前&#xff0c;如图所示&#xff1a; 解决方式&#xff0c;序列化日期&#xff08;localdatetime&#xff09;格式 步骤一、添加序列化类 package com.abliner.test.common.configure;import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fas…...

【Android】创建一个可以在屏幕上拖动的悬浮窗

项目需求 在界面上创建一个悬浮窗&#xff0c;可以自由的移动这个悬浮窗 需求解决 1.添加权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>2.请求权限 从 Android 6.0 (API 23) 开始&#xff0c;应用需要动态请求显示悬浮窗…...

SPI NAND、SD NAND和eMMC对比—MK米客方德

目录 1. 容量: 2.封装类型&#xff1a; 3.速度: 4.性能: 5.寿命: 6. 使用方式: 7. 其他优缺点: 8.常见应用场景: 1. 容量: SPI NAND通常提供从几百MB到几GB的存储容量。 SD NAND的容量覆盖范围比SPI NAND更广&#xff0c;从几GB到几十GB不等。 eMMC的容量范围更大&a…...

“深入解析:YUM仓库、RPM包与源码编译——Linux软件安装方式全面对比“

目录 YUM 仓库安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; RPM 包安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 源码编译安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 三者区别 YUM 仓库安装 概念&#xff1a; YUM&…...

中电金信:银行业私有云何去何从

2009年&#xff0c;云计算开始从概念走向实践。在这一年&#xff0c;Gartner在预测2010十大发展趋势中&#xff0c;将云计算列在榜首。在这之后&#xff0c;谷歌、亚马逊、IBM等科技巨头纷纷加码对云计算的研发投入。2010年正式迎来云计算时代&#xff0c;这一年也被定为“云元…...

Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。

Windows系统&#xff1a;Adobe Acrobat Pro或者Adobe Acrobat Reader首选项-一般-取消在同一窗口的新标签中打开文档&#xff08;需要重启&#xff09;的对勾&#xff0c;点击确定&#xff0c;彻底关闭后重启&#xff0c;这样打开的每一个PDF文件对应的是一个窗口&#xff0c;并…...

从0开始学习pyspark--pyspark的数据读取[第4节]

在PySpark中&#xff0c;读取文件型数据是一个常见的操作&#xff0c;Spark支持多种数据格式&#xff0c;如CSV、JSON、Parquet、Avro等。以下是一些常用的方法来读取不同格式的文件数据。 读取文本型数据 读取CSV文件: 使用spark.read.csv方法读取CSV文件&#xff0c;可以通…...

极速升级:MacOS系统中Pip源的切换指南

极速升级&#xff1a;MacOS系统中Pip源的切换指南 在MacOS系统中&#xff0c;Python的包管理工具Pip是我们管理和安装Python库的得力助手。然而&#xff0c;默认的Pip源在国外&#xff0c;对于国内用户来说&#xff0c;访问速度可能较慢。因此&#xff0c;更换Pip源以提高下载…...

服务器的分类,主流服务器的应用场景

一、服务器分类 服务器可以按应用层次、体系架构、用途、外形等进行分类。以下是详细说明&#xff1a; 按应用层次分类 入门级服务器&#xff1a;这些服务器一般用于小型企业或部门的简单任务&#xff0c;如文件共享和打印服务。工作组级服务器&#xff1a;适用于中小型企业&…...

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…...

从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路

在当今日新月异的科技浪潮中&#xff0c;安防监控领域的技术发展日新月异&#xff0c;全景摄像机便是这一领域的杰出代表。它以其独特的360度无死角监控能力&#xff0c;为各行各业提供了前所未有的安全保障&#xff0c;成为现代安防体系中的重要组成部分。 一、全景摄像机的技…...

Java学习 -Golang开发环境+目录结构+编译+部署

开发环境 环境变量设置 GOROOT 指定 golang sdk 的安装目录GOPATH golang 工作目录&#xff0c;项目的源码放在这个目录下PATH 将 GOROOT/bin 放在 Path 路径下&#xff0c;方便命令行能直接运行 golang的命令行工具项目目录结构 |--project // 位于G…...

Redis 典型应用——缓存(缓存预热,穿透,雪崩,击穿)

一、缓存 缓存是计算机中一个很经典的概念&#xff0c;核心思路是把一些常用的数据放到访问速度更快的地方&#xff0c;方便随时读取&#xff1b; 但对于计算机硬件来说&#xff0c;往往访问速度越快的设备&#xff0c;成本越高&#xff0c;存储空间越小&#xff0c;缓存是更…...

Sharding-JDBC分库分表的基本使用

前言 传统的小型应用通常一个项目一个数据库&#xff0c;单表的数据量在百万以内&#xff0c;对于数据库的操作不会成为系统性能的瓶颈。但是对于互联网应用&#xff0c;单表的数据量动辄上千万、上亿&#xff0c;此时通过数据库优化、索引优化等手段&#xff0c;对数据库操作…...

7月信用卡新规下:信用卡欠的钱不用还了?

说到信用卡&#xff0c;现在基本上人手一张&#xff0c;大家都有使用过。但你知道吗&#xff0c;使用信用卡不是这么简单容易的事&#xff0c;比如会对你的贷款有影响&#xff0c;透支不还逾期对生活的影响&#xff0c;信用卡新规对持卡人和银行那边的影响。 一、只要不逾期&am…...

坑——python的redis库的decode_responses设置

python的redis库查询返回的值默认是返回字节串&#xff0c;可以在redis.Redis()方法中通过设置decode_responses参数&#xff0c;让返回值直接是字符串&#xff1b; 查询返回字节串是因为Redis()方法中decode_responses默认值是False&#xff1a; 设置decode_responses为True就…...

从项目中学习Bus-Off的快慢恢复

0 前言 说到Bus-Off&#xff0c;大家应该都不陌生&#xff0c;使用VH6501干扰仪进行测试的文章在网上数不胜数&#xff0c;但是一般大家都是教怎么去干扰&#xff0c;但是说如何去看快慢恢复以及对快慢恢复做出解释比较少&#xff0c;因此本文以实践的视角来讲解Bus-Off的快慢恢…...

视频参考帧和重构帧复用

1、 视频编码中的参考帧和重构帧 从下图的编码框架可以看出&#xff0c;每编码一帧需要先使用当前帧CU(n)减去当前帧的参考帧CU&#xff08;n&#xff09;得到残差。同时&#xff0c;需要将当前帧的重构帧CU*&#xff08;n&#xff09;输出&#xff0c;然后再读取重构帧进行预测…...

js修改scss变量

style.scss $color : var(--color,#ccc); // 默认值 #ccc .color{background: $color; } 定义了一个scss变量&#xff08;$color&#xff09;&#xff0c;用普通的css变量&#xff08;--color&#xff09;给他赋值&#xff0c;这里需要一个默认值&#xff0c;此时css变量(--co…...

【中霖教育怎么样】报考注册会计师有年龄限制吗?

【中霖教育怎么样】报考注册会计师有年龄限制吗? 申请参加注册会计师考试有没有年龄约束? 对于注册会计师的考试&#xff0c;不存在具体的年龄上限。而且该考试的入学门栏相对低&#xff0c;主要对考生的年龄下限规定。 在专业阶段&#xff0c;注册会计师考试要求考生具备…...