当前位置: 首页 > 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…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Qt的学习(二)

1. 创建Hello Word 两种方式&#xff0c;实现helloworld&#xff1a; 1.通过图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示helloworld 2.通过纯代码的方式&#xff0c;通过编写代码&#xff0c;在界面上创建控件&#xff0c; 显示hello world&#xff1b; …...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…...

使用 uv 工具快速部署并管理 vLLM 推理环境

uv&#xff1a;现代 Python 项目管理的高效助手 uv&#xff1a;Rust 驱动的 Python 包管理新时代 在部署大语言模型&#xff08;LLM&#xff09;推理服务时&#xff0c;vLLM 是一个备受关注的方案&#xff0c;具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...

Angular中Webpack与ngx-build-plus 浅学

Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具&#xff0c;用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中&#xff0c;Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...

leetcode sql50题

在中文站没找到对应的集合&#xff0c;想来自己动手拷贝过来&#xff0c;方便大家面试复习用&#xff0c;对应英文站点&#xff1a; https://leetcode.com/studyplan/top-sql-50/ Select #1757. 可回收且低脂的产品 链接: https://leetcode.cn/problems/recyclable-and-low-fa…...