标准库中的string类(上)——“C++”

各位CSDN的uu们好呀,好久没有更新小雅兰的C++专栏的知识啦,接下来一段时间,小雅兰就又会开始更新C++这方面的知识点啦,以及期末复习的一些知识点,下面,让我们进入西嘎嘎string的世界吧!!!


首先,在学习西嘎嘎的过程中,我们需要学会去看文档!!!

西嘎嘎官方文档:cppreference.com

由于这个文档比较乱,所以一般用这个:cplusplus.com - The C++ Resources Network


string类的常用接口说明


string类的常用接口说明

string类对象的常见构造

https://cplusplus.com/reference/string/string/string/ 

函数名称功能说明
string() (重点)构造空的string类对象,即空字符串
string(const char* s) (重点) 用C-string来构造string类对象
string(const string&s) (重点) 拷贝构造函数
string(size_t n, char c) string类对象中包含n个字符c
int main()
{string s1;//构造空的string类对象s1string s2("hello world");//用C格式字符串构造string类对象s2string s3 = s2;//拷贝构造s3string s4(s2);//拷贝构造s4
}

 如果是想要把这些内容打印出来的话,就直接cout就可以了,因为库函数中已经重载了opeator<<!!!

#include<iostream>
#include<string>
using namespace std;
int main()
{string s1;//构造空的string类对象s1string s2("hello world");//用C格式字符串构造string类对象s2string s3 = s2;//拷贝构造s3string s4(s2);//拷贝构造s4cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;return 0;
}

这些就是最常见的,其余的只需要了解一下就可以了,需要的时候直接查文档! 

 string (const string& str, size_t pos, size_t len = npos);

substring constructor
Copies the portion of str that begins at the character position pos and spans len characters (or until the end of str, if either str is too short or if len is string::npos). 

str:Another string object, whose value is either copied or acquired.

pos:Position of the first character in str that is copied to the object as a substring.
If this is greater than str's length, it throws out_of_range.
Note: The first character in str is denoted by a value of 0 (not 1).

len:Length of the substring to be copied (if the string is shorter, as many characters as possible are copied).
A value of string::npos indicates all characters until the end of str.

n:Number of characters to copy.

int main()
{string s1;//构造空的string类对象s1string s2("hello world");//用C格式字符串构造string类对象s2string s3 = s2;//拷贝构造s3string s4(s2);//拷贝构造s4cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;string s5(s2, 0, 5);cout << s5 << endl;return 0;
}

 

 

static const size_t npos = -1//整型的最大值
int main()
{string s1;//构造空的string类对象s1string s2("hello world");//用C格式字符串构造string类对象s2string s3 = s2;//拷贝构造s3string s4(s2);//拷贝构造s4cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;string s5(s2, 0, 5);cout << s5 << endl;//下面这两种写法都是从字符串1的位置,取到结束string s6(s2, 1);string s7(s2, 1, 100);cout << s6 << endl;cout << s7 << endl;return 0;
}

 

string (const char* s, size_t n);

from buffer

Copies the first n characters from the array of characters pointed by s.

意思是从这个第n个字符开始拷贝,拷贝到目标字符串中!

int main()
{
    string s1;//构造空的string类对象s1
    string s2("hello world");//用C格式字符串构造string类对象s2
    string s3 = s2;//拷贝构造s3
    string s4(s2);//拷贝构造s4
    cout << s1 << endl;
    cout << s2 << endl;
    cout << s3 << endl;
    cout << s4 << endl;
    string s5(s2, 0, 5);
    cout << s5 << endl;
    //下面这两种写法都是从字符串1的位置,取到结束
    string s6(s2, 1);
    string s7(s2, 1, 100);
    cout << s6 << endl;
    cout << s7 << endl;
    string s8(s2, 5);
    cout << s8 << endl;
    return 0;

 可是,最后的打印结果为什么会是这样的呢?怎么会是打印 world呢?难道不应该是打印hello吗?

原来是用错了!它自动匹配到了上一个函数:string (const string& str, size_t pos, size_t len = npos); 

所以:string s8(s2, 5); 这句代码的意思是:从s2的第五个字符开始拷贝,一直拷贝到最后,直到后面再也没有内容!

应该这么写:

int main()
{string s1;//构造空的string类对象s1string s2("hello world");//用C格式字符串构造string类对象s2string s3 = s2;//拷贝构造s3string s4(s2);//拷贝构造s4cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;string s5(s2, 0, 5);cout << s5 << endl;//下面这两种写法都是从字符串1的位置,取到结束string s6(s2, 1);string s7(s2, 1, 100);cout << s6 << endl;cout << s7 << endl;string s8(s2, 5);cout << s8 << endl;string s9("hello world", 5);cout << s9 << endl;return 0;
}


 

string (size_t n, char c);

 fill constructor

Fills the string with n consecutive(连续的) copies of character c.

int main()
{string s1;//构造空的string类对象s1string s2("hello world");//用C格式字符串构造string类对象s2string s3 = s2;//拷贝构造s3string s4(s2);//拷贝构造s4cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;string s5(s2, 0, 5);cout << s5 << endl;//下面这两种写法都是从字符串1的位置,取到结束string s6(s2, 1);string s7(s2, 1, 100);cout << s6 << endl;cout << s7 << endl;string s8(s2, 5);cout << s8 << endl;string s9("hello world", 5);cout << s9 << endl;string s10(10, 'l');cout << s10 << endl;return 0;
}

 

 string的析构函数:

赋值运算符重载:

int main()
{string s1;//构造空的string类对象s1string s2("hello world");//用C格式字符串构造string类对象s2string s3 = s2;//拷贝构造s3string s4(s2);//拷贝构造s4cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;string s5(s2, 0, 5);cout << s5 << endl;//下面这两种写法都是从字符串1的位置,取到结束string s6(s2, 1);string s7(s2, 1, 100);cout << s6 << endl;cout << s7 << endl;string s8(s2, 5);cout << s8 << endl;string s9("hello world", 5);cout << s9 << endl;string s10(10, 'l');cout << s10 << endl;cout<<endl;s1 = s2;cout << s1 << endl;s1 = "world";cout << s1 << endl;s1 = 'l';cout << s1 << endl;return 0;
}

 

这个赋值支持得很宽泛!因为写了很多重载版本!但是平时用的比较多的是第一种!!!


string类对象的访问及遍历操作

函数名称功能说明
operator[] (重 点)返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭 代器
rbegin+endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭 代器
范围forC++11支持更简洁的范围for的新遍历方式

 

 

int main()
{string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;
}

int main()
{
    string s1("hello world");
    cout << s1.size() << endl;
    cout << s1.length() << endl;
    for (size_t i = 0; i < s1.size(); i++)
    {
        //cout << s1[i] << " ";
        cout << s1.operator[](i);————底层原理
    }
    cout << endl;

 

[]既可以读,又可以写!!!

int main()
{string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";//cout << s1.operator[](i);}cout << endl;s1[0] = 'z';cout << s1 << endl;
}

 

 那如果我现在想要把string逆置一下,那就简单了!

int main()
{string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";//cout << s1.operator[](i);}cout << endl;s1[0] = 'z';cout << s1 << endl;//把string逆置一下int begin = 0;int end = s1.size() - 1;while (begin < end){char tmp = s1[begin];s1[begin] = s1[end];s1[end] = tmp;begin++;end--;}cout << s1 << endl;return 0;
}

 这只是其中一种写法,可是,在西嘎嘎中,写这个交换,其实是没有意义的,因为:库函数中给我们提供了这个接口!!!

 

int main()
{
    string s1("hello world");
    cout << s1.size() << endl;
    cout << s1.length() << endl;
    for (size_t i = 0; i < s1.size(); i++)
    {
        cout << s1[i] << " ";
        //cout << s1.operator[](i);
    }
    cout << endl;
    s1[0] = 'z';
    cout << s1 << endl;

    //把string逆置一下
    int begin = 0;
    int end = s1.size() - 1;
    while (begin < end)
    {
        /*char tmp = s1[begin];
        s1[begin] = s1[end];
        s1[end] = tmp;*/
        swap(s1[begin], s1[end]);
        begin++;
        end--;
    }
    cout << s1 << endl;
    return 0;
}

 

 

 第二种遍历方式:iterator(迭代器)

string::iterator it = s1.begin();
while (it != s1.end())
{cout << *it << " ";++it;
}
cout << endl;

也可以修改!

string::iterator it = s1.begin();
while (it != s1.end())
{*it += 1;cout << *it << " ";++it;
}
cout << endl;

 

iterator的用法有点像指针!!!但是只是像指针,而不是就是指针!

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
vector<int>::iterator vit = v.begin();
while (vit != v.end())
{cout << *vit << " ";++vit;
}
cout << endl;
list<double> lt;
lt.push_back(1.1);
lt.push_back(2.1);
lt.push_back(3.1);
lt.push_back(4.1);
list<double>::iterator lit = lt.begin();
while (lit != lt.end())
{cout << *lit << " ";++lit;
}
cout << endl;

 


之前,我们手撕了一个string的逆置,但其实,西嘎嘎的库函数里面就有这个函数!

 

string::iterator it = s1.begin();
while (it != s1.end())
{
    *it += 1;
    cout << *it << " ";
    ++it;
}
cout << endl;
reverse(s1.begin(), s1.end());
cout << s1 << endl;

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
vector<int>::iterator vit = v.begin();
while (vit != v.end())
{
    cout << *vit << " ";
    ++vit;
}
cout << endl;
reverse(v.begin(), v.end());
vit = v.begin();
while (vit != v.end())
{
    cout << *vit << " ";
    ++vit;
}
cout << endl;


list<double> lt;
lt.push_back(1.1);
lt.push_back(2.1);
lt.push_back(3.1);
lt.push_back(4.1);
list<double>::iterator lit = lt.begin();
while (lit != lt.end())
{
    cout << *lit << " ";
    ++lit;
}
cout << endl;
reverse(lt.begin(), lt.end());
lit = lt.begin();
while (lit != lt.end())
{
    cout << *lit << " ";
    ++lit;
}
cout << endl;

 

 string、vector、list都逆置过来了!!!

 之前的那个operator[],提供了两个版本:

     char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;

 

第一个可以编译通过,第二个不能编译通过!

 编译器会去找更匹配的!

 

 

int main()
{string s1("hello world");const string s2("hello world");s1[0] = 'x';//s2[0] = 'x';cout << s2[0] << endl;string::const_iterator it = s2.begin();while (it != s2.end()){//*it += 1;cout << *it << " ";++it;}cout << endl;return 0;
}

 

 for (auto e : s1)
{
    cout << e << " ";
}
cout << endl;

但是实际上,迭代器才是yyds! 


所以,现在我们遍历,就有三种方法:

  • 下标+[]
  • 迭代器
  • 范围for

但是,主流还是迭代器!!!

 

 

void func(const string& s)
{string::const_reverse_iterator it = s.rbegin();while (it != s.rend()){cout << *it << " ";++it;}cout << endl;
}
int main()
{string s1("hello world");string::reverse_iterator it1 = s1.rbegin();while (it1 != s1.rend()){cout << *it1 << " ";++it1;}cout << endl;func(s1);return 0;
}


 


好啦,小雅兰今天的西嘎嘎string的使用部分就到这里啦,下一篇博客继续string的使用,后续还会写string模拟实现,加油!!!

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

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

相关文章

【论文简述】High-frequency Stereo Matching Network(CVPR 2023)

一、论文简述 1. 第一作者&#xff1a;Haoliang Zhao 2. 发表年份&#xff1a;2023 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;立体匹配、MVS、深度学习、高频信息、LSTM 5. 探索动机&#xff1a;(1)当涉及到估计的视差图的更精细的特征时&#xff0c;大多数当前…

Java反序列化工具ysoserial使用

ysoserial是一款用于生成 利用不安全的Java对象反序列化 的有效负载的概念验证工具。 项目地址 https://github.com/frohoff/ysoserial主要有两种使用方式&#xff0c;一种是运行ysoserial.jar 中的主类函数&#xff0c;另一种是运行ysoserial中的exploit 类&#xff0c;二者…

未来十年,人工智能就业方向及前景如何?

人工智能&#xff08;AI&#xff09;是一个快速发展的领域&#xff0c;对于未来的就业方向和前景有着巨大的影响。以下是一些可能的发展趋势和就业前景&#xff1a; 1、增长趋势&#xff1a;人工智能正在全球范围内经历巨大的增长&#xff0c;预计在未来十年内将继续保持这一趋…

一个正则快速找到在ES中使用profile的时产生慢查询的分片

在es中使用profile分析慢查询的时候&#xff0c;往往因为分片过多&#xff0c;或者因为查询条件太复杂&#xff0c;分析的结果几十万行。在kibana上点半天&#xff0c;也找不到一个耗时长的分片。 kibana上可以通过正则来匹配。其实我们只需要匹配到耗时大于10秒的请求。 检索语…

0x42 树状数组

0x42 树状数组 若一个正整数 x x x的二进制表示为 a k − 1 a k − 2 . . . a 2 a 1 a 0 a_{k-1}a_{k-2}...a_2a_1a_0 ak−1​ak−2​...a2​a1​a0​&#xff0c;其中等于1的位是 { a i 1 , a i 2 , . . . , a i m } \{a_{i_1},a_{i_2},...,a_{i_{m}}\} {ai1​​,ai2​​,...…

鸿蒙原生应用再添新丁!喜马拉雅入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;喜马拉雅入局鸿蒙 来自 HarmonyOS 微博12月20日消息&#xff0c; #喜马拉雅正式完成鸿蒙原生应用版本适配#&#xff0c;作为音频业巨头的喜马拉雅 &#xff0c;将基于#HarmonyOS NEXT#创造更丰富、更智慧的全场景“声音宇宙”&#xff01;#鸿…

Python 正则表达式入门:轻松掌握字符串匹配的艺术

Python 正则表达式入门&#xff1a;轻松掌握字符串匹配的艺术 引言&#xff1a;什么是正则表达式&#xff1f;基础知识&#xff1a;正则表达式的语法和规则Python中的正则表达式&#xff1a;re模块的使用实战应用&#xff1a;常见的正则表达式案例最佳实践与常见错误结语&#…

格密码:LWE设计公钥密码系统

目录 一. LWE公私钥对 二. 怎么加密&#xff1f; 三. 怎么解密&#xff1f; 四. 正确性分析 五. 安全性 在格密码中&#xff0c;LWE(Learning With Errors)问题非常重要&#xff0c;本文章将介绍一些基于LWE设计的公钥密码方案&#xff0c;并详细讨论这些方案是如何运行的…

oracle怎样才算开启了内存大页?

oracle怎样才算开启了内存大页&#xff1f; 关键核查下面三点&#xff1a; 1./etc/sysctl.conf vm.nr_hugepages16384这是给了32G&#xff0c;计划sga给30G&#xff0c;一般需多分配2-4G sysctl -p生效 看cat /proc/meminfo|grep Huge啥结果&#xff1f; 这种明显是配了…

蓝牙物联网开发与应用:五大核心应用场景!

蓝牙技术在物联网中的五大核心应用场景 1、智能家居 通过蓝牙连接智能家居设备&#xff0c;如智能灯泡、智能插座、智能恒温器等&#xff0c;可以实现远程控制、语音控制等功能&#xff0c;提高家居的智能化程度和便利性。 2、智能穿戴设备 蓝牙技术可以连接智能手表、智能手…

01AVue入门(持续学习中)

1.使用AVue开发简单的前端页面直接简单到起飞,他是Element PlusVueVite开发的,不需要向元素的前端代码一样一个组件要传很多参数,他可以使用Json文本来控制我们要传入的数据结构来决定显示什么 //我使用的比较新,我们也可以使用cdn直接使用script标签直接引入 2.开发中遇到的坑…

共享目录搭建

【linux系统】 1.sudo yum install nfs-utils 或 sudo apt install nfs-common 问题&#xff1a;如果apt install nfs-common报错dpkg: error processing package rpcbind (--configure) 解决方法&#xff1a;删除所有信息之后update sudo mv/var/lib/dpkg/info/ /va…

鸿蒙ArkTS语言介绍与TS基础法

1、ArkTS介绍 ArkTS是HarmonyOS主力应用开发语言&#xff0c;它在TS基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等响应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 JS 是一种属于网络的高级脚本语言&#xff0c;已经被广泛用…

【ITK库学习】使用itk库进行图像配准:“Hello World”配准(一)

目录 1、itkImageRegistrationMethod / itkImageRegistrationMethodv42、itkTranslationTransform3、itkMeanSquaresImageToImageMetric / itkMeanSquaresImageToImageMetric44、itkRegularStepGradientDescentOptimizerv / itkRegularStepGradientDescentOptimizerv4 图像配准…

MyBatis的ORM!!!

首先你要明白为什么使用ORM&#xff1a;我们看一个示例&#xff0c;我们发现我们要声明的pojo类中的属性名和数据库中的字段名不一致&#xff0c;这时就需要我们使用MyBatis的ORM。 首先还是准备工作&#xff1a; 1.创建Maven工程&#xff0c;还没有配置Maven的和还不会的去看这…

2023年12月20日学习总结

今日to do list&#xff1a; 学习kaggle中store sales中的dart forcasting&#x1f3af; 大概搜集一个声纹识别的报告&#xff08;老师给的新项目&#x1f62d;&#xff09; 学习时不刷手机 okkkkkkkkkkkkkk 开始&#x1f44d; 1. 时间序列预测- a complete guide 总结一下这…

mysql创建用户和赋权

1.创建用户 CREATE USER new_userlocalhost IDENTIFIED BY user_password; “localhost"只允许本地连接&#xff0c;而”%"允许所有IP地址都可以连接到服务器。 2.赋权 GRANT ALL PRIVILEGES ON database_name.* TO new_userlocalhost; FLUSH PRIVILEGES; 3.给…

【C++初阶】学习string类的模拟实现

目录 前言&#xff1a;一、创建文件和类二、实现string类2.1 私有成员和构造函数2.2 析构函数2.3 拷贝构造函数2.3.1 写法12.3.2 写法2 2.4 赋值重载函数2.4.1 写法12.4.2 写法2 2.5 迭代器遍历访问2.6 下标遍历访问2.7 reserve2.8 resize2.9 判空和清理2.10 尾插2.10.1 尾插字…

计算机组成原理综合2

21、和外存储器相比&#xff0c;内存储器的特点是________。C A. 容量大、速度快、成本低 B. 容量大、速度慢、成本高 C. 容量小、速度快、成本高 D. 容量小、速度快、成本低 22、某计算机字长16位&#xff0c;存储器容量64KB&#xff0c;若按字编址&#xf…

diffusers-Inpainting

原文链接&#xff1a;添加链接描述 白色mask区域仅使用生成出来的&#xff0c;非白色mask区域使用原始影像&#xff0c;但是图像有点不平滑 import PIL import numpy as np import torchfrom diffusers import AutoPipelineForInpainting from diffusers.utils i…