C++ —— string容器(上)

C++ —— string容器(上)

  • string 容器的优点
  • string 的构造函数
  • 示例代码

string 容器的优点

string字符容器,内部维护了一个动态的字符数组。
与普通的字符数组相比,string容器有三个优点:

  1. 使用的时候,不必考虑内存分配释放的问题;
  2. 动态管理内存(可扩展);
  3. 提供了大量操作容器的API

string 的构造函数

缺点是效率略有降低,占用的资源也更多。string类是std::basic_string类模板的一个具体化版本的别名。
NBTS(null-terminated string):C风格的字符串(以空字符0结束的字符串)。
string类有七个构造函数(C++11新增了两个,前三个用的多):

  1. string(); 创建一个长度为0string对象(默认构造函数)。
  2. string(const char *s);string对象初始化为s指向的NBTS(转换函数)。
  3. string(const string &str);string对象初始化为str(拷贝构造函数)。
  4. string(const char *s,size_t n);string对象初始化为s指向的地址后n字节的内容。
  5. string(const string &str, size_t pos=0, size_t n=npos);sring对象初始化为str从位置pos开始到结尾的字符(或从位置pos开始的n个字符)。
  6. template<class T> string(T begin,T end);string对象初始化为区间[begin,end]内的字符,其中beginend的行为就像指针,用于指定位置,范围包括begin在内,但包括end
  7. string(size_t n,char c); 创建一个由n个字符c组成的string对象。

示例代码

直接看示例代码更加清楚:

#include <iostream>
using namespace std;

int main() {
    // 1)string(); // 创建一个长度为0的string对象(默认构造函数)。
    string s1;
    cout << "s1 = " << s1 << endl; // 因为容器是空的,所以输出空:s1 = 
    cout << "s1.size() = " << s1.size() << endl; // 输出:0
    cout << "s1.capacity() = " << s1.capacity() << endl; // 输出:15
    cout << "容器动态数组的首地址:" << (void*)s1.c_str() << endl;
    // 容器动态数组的首地址:0x7ffd29eb5890
    s1 = "qwewvfwfe235dery13";
    cout << "s1 = " << s1 << endl;
    cout << "s1.size() = " << s1.size() << endl; // 输出:18
    cout << "s1.capacity() = " << s1.capacity() << endl; // 输出:30
    cout << "容器动态数组的首地址:" << (void*)s1.c_str() << endl;
    // 容器动态数组的首地址:0x5609c668bec0
    
    // 2)string(const char *s); // 将string对象初始化为s指向的NBTS(转换函数)。
    string s2("aaaaaaaaa");
    cout << "s2 = " << s2 << endl; // 输出:aaaaaaaaa
    cout << (void*)s2.c_str() << endl; // 0x7ffd29eb58b0
    string s3 = "bbbbbbbbb";
    cout << "s3 = " << s3 << endl; // 输出:bbbbbbbbb
    cout << (void*)s3.c_str() << endl; // 0x7ffd29eb58d0

    // // 3)string(const string &str); // 将string对象初始化为str(拷贝构造函数)。
    string s4(s3);
    cout << "s4 = " << s4 << endl; // 输出:bbbbbbbbb
    cout << (void*)s4.c_str() << endl; // 0x7ffd29eb58f0 与s3不同
    string s5 = s2;
    cout << "s5 = " << s5 << endl; // 输出:aaaaaaaaa
    cout << (void*)s5.c_str() << endl; // 0x7ffd29eb5910 与s2不同

    // // 4)string(const char *s,size_t n); // 将string对象初始化为s指向的地址后n字节的内容。
    string s6("1234567890", 5);
    cout << "s6 = " << s6 << endl; // 输出:12345
    string s7("abcde", 50);
    cout << "s7 = " << s7 << endl; // 输出:abcde再加上一堆乱码
    
    // // 5)string(const string &str,size_t pos=0,size_t n=npos); // 将sring对象初始化为str从位置pos开始到结尾的字符(或从位置pos开始的n个字符)。
    string s = "0123456789";
    string s8(s, 3);
    cout << "s8 = " << s8 << endl; // s8 = 3456789
    string s9(s, 5, 3);
    cout << "s9 = " << s9 << endl; // s9 = 567

    // // 6)template<class T> string(T begin,T end); // 将string对象初始化为区间[begin,end]内的字符,其中begin和end的行为就像指针,用于指定位置,范围包括begin在内,但不包括end。(以后再补充)
    
    // // 7)string(size_t n,char c); // 创建一个由n个字符c组成的string对象。
    string s10(10, 'a');
    cout << "s10 = " << s10 << endl; // 输出:aaaaaaaaaa
    cout << "s10.size() = " << s10.size() << endl; // 输出:10
    cout << "s10.capacity() = " << s10.capacity() << endl; // 输出:15

    return 0;
}

capacity()获取容器的当前容量。意思是,如果不重新分配内存,当前可以存放字符的总个数。
size()获取容器数据的大小,意思是,里面已经存放了多少个字符。
string容器中存放数据时,如果数据多大就分配多大的内存,那么每次扩展容器时,都要重新分配内存,效率低。所以,合理的做法是预先分配比数据实际大小更多的空间,避免过于频繁的分配和释放内存。
扩展空间时,先分配更大的空间,再把内容复制过去,最后释放以前的空间。所以,s1扩展前后首地址不一样。

感谢浏览,一起学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956562.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的健身房管理系统【源码+文档+部署讲解】

系统介绍 基于SpringBootVue实现的健身房管理系统采用前后端分离架构方式&#xff0c;系统设计了管理员、会员、员工三种角色&#xff0c;系统实现了用户登录与注册、个人中心、会员管理、员工管理、会员卡管理、会员卡类型管理、教练信息管理、解聘管理、健身项目管理、指导项…

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统可以涵盖多个功能模块&#xff0c;例如用户管理、设备管理、预约管理、计费管理等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的系统。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …

Langchain+FastApi+Vue前后端Ai对话(超详细)

一、引入 首先可以先看下作者的文章 FastApi相关文章&#xff1a;创建最简单FastApi的项目Vue相关文章&#xff1a;最简单的aixos二次封装Langchain相关文章&#xff1a;如何使用LangSmith跟踪deepseek模型 二、后端搭建 1 项目文件结构 routers&#xff1a;存放api接口se…

图像去雾数据集的下载和预处理操作

前言 目前&#xff0c;因为要做对比实验&#xff0c;收集了一下去雾数据集&#xff0c;并且建立了一个数据集的预处理工程。 这是以前我写的一个小仓库&#xff0c;我决定还是把它用起来&#xff0c;下面将展示下载的路径和数据处理的方法。 下面的代码均可以在此找到。Auo…

Java中json的一点理解

一、Java中json字符串与json对象 1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串&#xff0c;它遵循json这种格式。 2、前后端交互传输的json是什么&#xff1f; 前后端交互传输的json都是json字符串 比如&#xff1a;…

React实现拖拽特效

前言 最近&#xff0c;我看到一个工程师的个人网站上&#xff0c;采用了拖拽作品集的互动特效&#xff0c;既有趣又吸引眼球。经过一些研究&#xff0c;我发现其实借助一些现成的套件&#xff0c;就能轻松实现这样的效果。今天就带大家一起看看&#xff0c;如何通过 Framer Mo…

leetcode904-水果成篮

leetcode 904 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) 之前发布了一个滑动窗口的题目解答思路&#xff0c;参考博文&#xff1a;长度最小的子数组 本题也是基于滑动窗口的一个扩展题&#xff0c;主要解决方法是利用滑动窗口哈希表 var totalFruit function…

线性代数概述

矩阵与线性代数的关系 矩阵是线性代数的研究对象之一&#xff1a; 矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础&#xff0c;而矩阵运算则简洁地表示和…

李宏毅机器学习HW1: COVID-19 Cases Prediction

Kaggle数据集和提交链接 特征选择&#xff08;主要修改地方&#xff09; 在sample code的基础上主要修改了Select_feat选择特征函数。 首先&#xff0c;因为数据集中的第一列是id&#xff0c;先在raw_x_train&#xff0c;raw_x_valid&#xff0c;raw_x_test中都去掉这一列。其…

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…

VD:生成a2l文件

目录 前言Simulink合并地址 ASAP2 editor 前言 我之前的方法都是通过Simulink模型生成代码的过程中顺便就把a2l文件生成出来了&#xff0c;这时的a2l文件还没有地址&#xff0c;所以紧接着会去通过elf文件更新地址&#xff0c;一直以为这是固定的流程和方法&#xff0c;今天无…

Navicat Premium 数据可视化

工作区&#xff0c;数据源以及图表 数据可视化是使用可视化组件&#xff08;例如图表&#xff0c;图形和地图&#xff09;的信息和数据的图形表示。 数据可视化工具提供了一种可访问的方式&#xff0c;用于查看和理解数据中的趋势&#xff0c;异常值和其他模式。 在Navicat中&…

设置 Git 默认推送不需要输入账号和密码【Ubuntu、SSH】

如何设置 Git 默认推送不需要输入账号和密码 在使用 Git 管理代码时&#xff0c;许多开发者会遇到每次推送&#xff08;push&#xff09;或拉取&#xff08;fetch&#xff09;代码时都需要输入 GitHub 或 GitLab 等远程仓库的账号和密码的情况。虽然设置了用户名和电子邮件信息…

TCP Window Full是怎么来的

wireshark查看包时&#xff0c;会看到TCP Window Full&#xff0c;总结下它的特点&#xff1a; 1. Sender会显示 TCP Window Full 2. “Sender已发出&#xff0c;但&#xff0c;Receiver尚未ack的字节”&#xff0c;即Sender的 bytes in flights 3. Sender的 bytes in fligh…

PyTorch框架——基于WebUI:Gradio深度学习ShuffleNetv2神经网络蔬菜图像识别分类系统

第一步&#xff1a;准备数据 蔬菜数据集&#xff0c;英文为Vegetable。 train 目录下有15000 张图片。 共十五种植物的幼苗图片集&#xff0c;分别为classes [Bean, Bitter_Gourd, Bottle_Gourd, Brinjal, Broccoli, Cabbage, Capsicum, Carrot, Cauliflower, Cucumber, Pa…

WPS数据分析000001

目录 一、表格的新建、保存、协作和分享 新建 保存 协作 二、认识WPS表格界面 三、认识WPS表格选项卡 开始选项卡 插入选项卡 页面布局选项卡 公式选项卡 数据选项卡 审阅选项卡 视图选项卡 会员专享选项卡 一、表格的新建、保存、协作和分享 新建 ctrlN------…

网络安全 | 什么是正向代理和反向代理?

关注&#xff1a;CodingTechWork 引言 在现代网络架构中&#xff0c;代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介&#xff0c;帮助管理、保护和优化数据流。根据代理的工作方向和用途&#xff0c;代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…

某讯一面,感觉问Redis的难度不是很大

前不久&#xff0c;有位朋友去某讯面试&#xff0c;他说被问到了很多关于 Redis 的问题&#xff0c;比如为什么用 Redis 作为 MySQL 的缓存&#xff1f;Redis 中大量 key 集中过期怎么办&#xff1f;如何保证缓存和数据库数据的一致性&#xff1f;我将它们整理出来&#xff0c;…

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…