C++学习笔记(7)

181、string 容器
string 是字符容器,内部维护了一个动态的字符数组。
与普通的字符数组相比,string 容器有三个优点:1)使用的时候,不必考虑内存分配和释放的问题;
2)动态管理内存(可扩展);3)提供了大量操作容器的 API。缺点是效率略有降低,占用的资源也更
多。
string 类是 std::basic_string 类模板的一个具体化版本的别名。
using std::string=std::basic_string<char, std::char_traits<char>, std::allocator<char>> 一、构造和析构
静态常量成员 string::npos 为字符数组的最大长度(通常为 unsigned int 的最大值);
NBTS(null-terminated string):C 风格的字符串(以空字符 0 结束的字符串)。
string 类有七个构造函数(C++11 新增了两个):
1)string(); // 创建一个长度为 0 的 string 对象(默认构造函数)。
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]内的字
符,其中 begin 和 end 的行为就像指针,用于指定位置,范围包括 begin 在内,但不包括 end。
7)string(size_t n,char c); // 创建一个由 n 个字符 c 组成的 string 对象。
析构函数~string()释放内存空间。
C++11 新增的构造函数:
1)string(string && str) noexcept:它将一个 string 对象初始化为 string 对象 str,并可能修改 str
(移动构造函数)。
2)string(initializer_list<char> il):它将一个 string 对象初始化为初始化列表 il 中的字符。
例如:string ss = { 'h','e','l','l','o' };
示例:
#include <iostream>
using namespace std;
int main()
{
// 1)string():创建一个长度为 0 的 string 对象(默认构造函数)。
string s1; // 创建一个长度为 0 的 string 对象
cout << "s1=" << s1 << endl; // 将输出 s1=
cout << "s1.capacity()=" << s1.capacity() << endl; // 返回当前容量,可以存放字符的
总数。
cout << "s1.size()=" << s1.size() << endl; // 返回容器中数据的大小。
cout << "容器动态数组的首地址=" << (void *)s1.c_str() << endl;
s1 = "xxxxxxxxxxxxxxxxxxxx";
cout << "s1.capacity()=" << s1.capacity() << endl; // 返回当前容量,可以存放字符的
总数。
cout << "s1.size()=" << s1.size() << endl; // 返回容器中数据的大小。
cout << "容器动态数组的首地址=" << (void *)s1.c_str() << endl;
// 2)string(const char *s):将 string 对象初始化为 s 指向的 NBTS(转换函数)。
string s2("hello world");
cout << "s2=" << s2 << endl; // 将输出 s2=hello world
string s3 = "hello world";
cout << "s3=" << s3 << endl; // 将输出 s3=hello world
// 3)string(const string & str):将 string 对象初始化为 str(拷贝构造函数)。
string s4(s3); // s3 = "hello world";
cout << "s4=" << s4 << endl; // 将输出 s4=hello world
string s5 = s3;
cout << "s5=" << s5 << endl; // 将输出 s5=hello world
// 4)string(const char* s, size_t n):将 string 对象初始化为 s 指向的 NBTS 的前 n 个字符,
即使超过了 NBTS 结尾。
string s6("hello world", 5);
cout << "s6=" << s6 << endl; // 将输出 s6=hello
cout << "s6.capacity()=" << s6.capacity() << endl; // 返回当前容量,可以存放字符的
总数。
cout << "s6.size()=" << s6.size() << endl; // 返回容器中数据的大小。
string s7("hello world", 50);
cout << "s7=" << s7 << endl; // 将输出 s7=hello 未知内容
cout << "s7.capacity()=" << s7.capacity() << endl; // 返回当前容量,可以存放字符的
总数。
cout << "s7.size()=" << s7.size() << endl; // 返回容器中数据的大小。
// 5)string(const string & str, size_t pos = 0, size_t n = npos):
// 将 string 对象初始化为 str 从位置 pos 开始到结尾的字符,或从位置 pos 开始的 n 个字符。
string s8(s3, 3, 5); // s3 = "hello world";
cout << "s8=" << s8 << endl; // 将输出 s8=lo wo
string s9(s3, 3);
cout << "s9=" << s9 << endl; // 将输出 s9=lo world
cout << "s9.capacity()=" << s9.capacity() << endl; // 返回当前容量,可以存放字符的
总数。
cout << "s9.size()=" << s9.size() << endl; // 返回容器中数据的大小。
string s10("hello world", 3, 5);
cout << "s10=" << s10 << endl; // 将输出 s10=lo wo
string s11("hello world", 3); // 注意:不会用构造函数 5),而是用构造函数
4)
cout << "s11=" << s11 << endl; // 将输出 s11=hel
// 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 s12(8, 'x');
cout << "s12=" << s12 << endl; // 将输出 s12=xxxxxxxx
cout << "s12.capacity()=" << s12.capacity() << endl; // s12.capacity()=15
cout << "s12.size()=" << s12.size() << endl; // s12.size()=8
string s13(30, 0);
cout << "s13=" << s13 << endl; // 将输出 s13=
cout << "s13.capacity()=" << s13.capacity() << endl; // s13.capacity()=31
cout << "s13.size()=" << s13.size() << endl; // s12.size()=30
}
示例 2:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
char cc[8]; // 在栈上分配 8 字节的内存空间。
// 把 cc 的内存空间用于字符串。
strcpy(cc, "hello");
cout << "cc=" << cc << endl << endl;
// 把 cc 的内存空间用于 int 型整数。
int* a, * b;
a = (int *)cc; // 前 4 个字节的空间用于整数 a。
b = (int *)cc + 4; // 后 4 个字节的空间用于整数 b。
*a = 12345; *b = 54321;
cout << "*a=" << *a << endl;
cout << "*b=" << *b << endl << endl;
// 把 cc 的内存空间用于 double。
double* d = (double*)cc; *d = 12345.7;
cout << "*d=" << *d << endl << endl;
// 把 cc 的内存空间用于结构体。
struct stt
{
int a;
char b[4];
}*st;
st = (struct stt*)cc;
st->a = 38;
strcpy(st->b, "abc");
cout << "st->a=" << st->a << endl;
cout << "st->b=" << st->b << endl << endl;
// void* malloc(size_t size);
//char* cc1 = (char*)malloc(8);
//int* cc1 = (int*)malloc(8);
}
示例 3:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
struct st_girl { // 超女结构体。
int bh;
char name[30];
bool yz;
double weight;
string memo;
} girl;
cout << "超女结构体的大小:" << sizeof(struct st_girl) << endl;
string buffer; // 创建一个空的 string 容器 buffer。
// 生成 10 名超女的信息,存入 buffer 中。
for (int ii = 1; ii <= 10; ii++)
{
// 对超女结构体成员赋值。
memset(&girl, 0, sizeof(struct st_girl));
girl.bh = ii;
sprintf(girl.name, "西施%02d", ii);
girl.yz = true;
girl.weight = 48.5 + ii;
girl.memo = "中国历史第一美女。";
// 把超女结构追加到 buffer 中。
buffer.append((char*)&girl, sizeof(struct st_girl));
}
cout << "buffer.capacity()=" << buffer.capacity() << endl; // 显示容量。
cout << "buffer.size()=" << buffer.size() << endl; // 显示实际大小。
// 用一个循环,把 buffer 容器中全部的数据取出来。
for (int ii = 0; ii < buffer.size() / sizeof(struct st_girl); ii++)
{
memset(&girl, 0, sizeof(struct st_girl)); // 初始化超女结构体。
// 把容器中的数据复制到超女结构体。
memcpy(&girl , buffer.data() + ii * sizeof(struct st_girl), sizeof(struct st_girl));
// buffer.copy((char*)&girl, sizeof(struct st_girl), ii * sizeof(struct st_girl));
// 显示超女结构体成员的值。
cout << "bh=" << girl.bh << ",name=" << girl.name << ",yz=" << girl.yz <<
",weight=" << girl.weight << ",memo=" << girl.memo << endl;
}
}
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docke实战扩展二(docker build -t nginx:latest . 实战详解)

docker build -t nginx:latest . 是 Docker 中用于构建镜像的命令。下面我们来详细解释这个命令,并通过一个具体的生产案例来演示其实际应用。 命令解释 docker build:这是 Docker CLI 中用于构建镜像的命令。-t nginx:latest:这是为构建的镜像指定标签(tag)。-t 是 --ta…

英文缩写大全(IT 领域和电子行业制造领域)

英文缩写大全&#xff08;IT 领域和电子行业制造领域&#xff09; 前言一、计算机通用二、WINDOWS三、LINUX四、编程语言1. 前端 / 设计2. JAVA / Android3. PHP4. Python 四、电子行业制造领域五、常识 前言 本文收集了各类英文缩写大全&#xff0c;方便查阅&#xff0c;主要…

使用 Nginx 部署前端 Vue.js 项目

引言 Vue.js 是一个流行的前端框架&#xff0c;用于构建用户界面。当涉及到生产环境的部署时&#xff0c;选择一个合适的 web 服务器是非常重要的。Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;非常适合用来部署前端应用程序。本文将指导你如何使用 Nginx 部署一个…

ACM个人模板总结

一切的开始 初始模板 // o2 o3 优化防止卡常 #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h> using namespace std; #define lowbit(x) (x&(-x)) #define endl "\n" #define LF(x) fixed<<setprecision(x)// c 保留小…

在线演示文稿应用PPTist本地化部署并实现无公网IP远程编辑PPT

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

C#编程语言及.NET 平台快速入门指南

Office Word 不显示 Citavi 插件&#xff0c;如何修复&#xff1f;_citavi安装后word无加载项-CSDN博客 https://blog.csdn.net/Viviane_2022/article/details/128946061?spm1001.2100.3001.7377&utm_mediumdistribute.pc_feed_blog_category.none-task-blog-classify_ta…

CSS选择器:一文带你区分CSS中的伪类和伪元素!

一、伪类选择器 1、什么是伪类选择器 伪类选择器&#xff0c;顾名思义&#xff0c;是一种特殊的选择器&#xff0c;它用来选择DOM元素在特定状态下的样式。这些特定状态并不是由文档结构决定的&#xff0c;而是由用户行为&#xff08;如点击、悬停&#xff09;或元素的状态&a…

Java SpringBoot构建传统文化网,三步实现信息展示,传承文化精髓

✍✍计算机毕业编程指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java…

大道至简,大厂官网基本都走简洁化设计路线。

「大道至简」是一种设计理念&#xff0c;强调设计应该追求简洁、直观、易用&#xff0c;而不是过多的修饰和繁琐的细节。 对于大厂的官网来说&#xff0c;简洁化设计路线的选择可能有以下几个原因&#xff1a; 1. 更好的用户体验&#xff1a; 简洁的设计可以让用户更容易地理…

磁盘调度管理中移臂调度和旋转调度

在磁盘调度管理中&#xff0c;移臂调度和旋转调度是两种不同的优化调度方法&#xff0c;用来提高磁盘读写效率。我们可以通过以下两种方式来理解它们&#xff1a; 1. 移臂调度&#xff08;Seek Scheduling&#xff09; 移臂调度是指磁盘驱动器的磁头在不同的柱面&#xff08;…

NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版

Paragon NTFS for Mac 15.4.44 中文破解版是一个底层的文件系统驱动程序,专门开发用来弥合Windows和Mac OS X之间的不兼容性&#xff0c;通过在Mac OS X系统下提供对任何版本的NTFS文件系统完全的读写访问服务来弥合这种不兼容性。为您轻松解决Mac不能识别Windows NTFS文件难题…

华为鸿蒙系统和安卓的区别

华为鸿蒙系统和安卓系统在多个方面存在显著差异&#xff0c;以下是对两者区别的详细分析&#xff1a; 一、开发商与背景 鸿蒙系统&#xff1a;由中国的华为公司主导开发&#xff0c;旨在创造一个超级虚拟终端互联的世界&#xff0c;将人、设备、场景有机地联系在一起。自2012…

【深度学习】线性回归的从零开始实现与简洁实现

前言 我原本后面打算用李沐老师那本《动手学深度学习》继续“抄书”&#xff0c;他们团队也免费提供了电子版(https://zh-v2.d2l.ai/d2l-zh-pytorch.pdf)。但书里涉及到代码&#xff0c;一方面展示起来不太方便&#xff0c;另一方面我自己也有很多地方看不太懂。 这让我开始思…

Pepper佩盼尔wordpress模板

Pepper佩盼尔WordPress模板是一款专为追求简洁、现代和专业外观的网站设计者和开发者打造的高品质主题。它以简站为主题&#xff0c;强调“让建网站更简单”的理念&#xff0c;旨在为用户提供一个易于使用、功能丰富的平台来构建他们的在线业务或个人网站。 模板特点包括&…

手机玩黑神话悟空二周目 GameViewer远程助你手机畅玩黑神话悟空 解锁全成就全收集

用手机摸鱼完成黑神话悟空二周目全收集、成就全解锁&#xff0c;实现随时随地玩黑神话悟空&#xff0c;你可以用网易GameViewer远程。 这款远程控制软件专为游戏玩家打造&#xff0c;不管你是上班族&#xff0c;还是学生党&#xff0c;都可以用它在手机、平板上玩黑神话悟空&am…

Vue输入框模糊搜索的多种写法

&#xff08;1&#xff09;模板方案 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</…

音频如何低延时回声消除与降噪篇保姆级教程

目录 1 回声消除技术 1.1 回声产生的原因 1.2 传统回声消除方法 1.3 先进的回声消除算法 2 降噪技术 2.1 降噪技术的原理与方法 2.2 传统降噪方法 2.3 先进的降噪算法 3 低延时处理技术 3.1 低延时处理的重要性 3.2 低延时回声消除技术 3.3 低延时降噪技术 4 调试…

Netty系列-2 NioServerSocketChannel和NioSocketChannel介绍

背景 本文介绍Netty的通道组件NioServerSocketChannel和NioSocketChannel&#xff0c;从源码的角度介绍其实现原理。 1.NioServerSocketChannel Netty本质是对NIO的封装和增强&#xff0c;因此Netty框架中必然包含了对于ServerSocketChannel的构建、配置以及向选择器注册&am…

谈一谈JVM的GC(垃圾回收)

JVM&#xff08;Java Virtual Machine&#xff09;的GC&#xff08;Garbage Collection&#xff0c;垃圾回收&#xff09;是Java语言的一个重要特性&#xff0c;它负责自动管理内存&#xff0c;释放那些不再被使用的对象所占用的内存空间。以下是对JVM GC的详细介绍&#xff1a…

Python 全栈系列266 Kafka服务的Docker搭建

说明 在大量数据处理任务下的缓存与分发 这个算是来自顾同学的助攻1&#xff0c;我有点java绝缘体的体质&#xff0c;碰到和java相关的安装部署总会碰到点奇怪的问题&#xff0c;不过现在已经搞定了。测试也接近了kafka官方标称的性能。考虑到网络、消息的大小等因素&#xff0…