(P26)string:标准库类型,string介绍 ,string对象的定义和初始化 ,常用成员函数

本文主要是介绍(P26)string:标准库类型,string介绍 ,string对象的定义和初始化 ,常用成员函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.标准库类型
    • 2.string介绍
    • 3.string对象的定义和初始化
    • 4.常用成员函数

1.标准库类型

  • (1)string 字符串 对应char*
  • (2)vector 动态数组 对应静态数组(空间不能扩展)
  • (3)map key/value 内部是以树的形式存储的,时间复杂度是O(log2N),若内部采用数组来存储的话就是哈希表,时间复杂度是O(1)

2.string介绍

  • string属于STL
  • 标准string类型
    (1)string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作
    (2)要使用string类型对象,必须包含相关头文件
    (3)
#include <string>
using std::string;typedef basic_string<char> string;//basic_string<char>表示模板类,string是一个模板类
//能接收3个参数,后2个参数是默认参数
typedef basic_string<schar_t> wstring;//支持宽字符
  • 通过vs2008手册查看string类的使用方法
    实际上接收的是3个参数
    实际上是基于basic_string模板类来重新定义的string类型,当作普通类即可
    在这里插入图片描述
    继续查看basic_string
    在这里插入图片描述
    实际上是继承至public_String_val类;
    传递的三个参数是:_Elem,_Traits,_Ax;
    在这里插入图片描述
    进一步,
    在这里插入图片描述
    发现第2个和第3个参数有默认值,意味着可以不必传递,我们定义的string实际上传递的是char,相当于:
typedef basic_string<char> string;

在这里插入图片描述

3.string对象的定义和初始化

  • eg:
string s1;//默认构造函数,s1为空串
string s2(s1);//将s2初始化为s1的一个副本
string s3("value");//将s33初始化为一个字符串字面值副本
string s4(n, 'c');//将s4初始化为字符'c'的n个副本
  • string的构造函数的帮助手册的使用方法,还是以vs2008为例
    点F1查看帮助,看有哪些构造函数
    在这里插入图片描述
    在这里插入图片描述
    进去之后,查看构造函数的帮助
    在这里插入图片描述
    有很多成员,查看构造函数成员
    在这里插入图片描述

  • 构造函数(1)

basic_string<char> s3("xxx");//等价于string s3("xxx");

Allocator是STL的6大组件之一,内存分配器
value_type就是传递进去的char类型
在这里插入图片描述

  • 构造函数(2)
string s4("abcdefg", 4);//传递进去的是四个字符

_count表示字符串中的几个字符来构造字符串
在这里插入图片描述

  • 构造函数(2)
    string s5(s2, 2, 3);

第一个参数是字符串对象,以_Right来构造一个对象
从字符串对象的哪个字符开始,几个字符来构造一个对象

在这里插入图片描述

  • 构造函数(3)
    构造_Count个数的字符串
string s4(n, 'c');//将s4初始化为字符'c'的n个副本

在这里插入图片描述

  • 构造函数(4)
    构造一个空的字符串
    在这里插入图片描述

  • 构造函数(5)
    传递2个迭代器的形式
    在这里插入图片描述

  • eg:P26\01.cpp

#include <string>
#include <iostream>
using namespace std;int main(void)
{//当作普通的类即可,实际上基于basic_string模板类来重新定义的string类型string s1;string s2("abcdefghijkl");cout<<s2<<endl;basic_string<char> s3("xxx");//等价于string s3("xxx");cout<<s3<<endl;string s4("abcdefg", 4);//传递进去的是四个字符cout<<s4<<endl;//将对象s2以2的位置开始构造,构造3个string s5(s2, 2, 3);cout<<s5<<endl;//iterator迭代器,直接看成char*就可以了string::iterator first = s2.begin() + 1; //从b开始// string::iterator first = s2.begin() + 3; //输出bcstring::iterator last = s2.end();//到l的下一个string s6(first, last);//区间实际是:[first, last)cout<<s6<<endl;return 0;
}
  • 测试:
    在这里插入图片描述

4.常用成员函数

  • 成员函数不止这些,使用的时候通过帮助去查看怎么使用
    在这里插入图片描述

  • vs2008中,成员函数查看帮助的过程:
    按下F1,找到Stardard C++ Library Refrence
    在这里插入图片描述
    在这里插入图片描述
    下面就可以看到成员函数了
    在这里插入图片描述

  • substr(),构造函数
    第一个参数是位置,第二个参数是字符数,npos默认=-1
    返回值是basic_string,即是一个字符串
    点击substr进去
    在这里插入图片描述

在这里插入图片描述

  • find()
    第一个参数查找一个字符
    第二个参数是从什么位置开始查找
    返回值:size_type,表示有没有找到
    在这里插入图片描述

从某个位置查找,是否包含这个字符串
在这里插入图片描述

查找一个字符串_Count个字符与之匹配即可
在这里插入图片描述

查找一个字符串对象,从_Off位置开始查找
在这里插入图片描述

  • rfind(),构造函数
    npos代表查找的位置
    在这里插入图片描述

  • eg:P26\02.cpp

#include <string>
#include <iostream>
using namespace std;int main(void)
{string s1("abcdefdg");cout<<s1.size()<<endl;//等价于cout<<s1.length()<<endl;cout<<s1.empty()<<endl;//空串返回为truecout<<s1.substr(1,2)<<endl;//不会更改s1cout<<s1.substr(1)<<endl;//等价于cout<<s1.substr(1,-1)<<endl;-1是默认的,实际上是string::npos//cout<<s1.substr(1, string::npos)<<endlstring::size_type pos = s1.find('A', 1);//从1的位置开始找,若不填则从0位置开始找if (pos == string::npos)cout<<"not found"<<endl;elsecout<<"pos="<<pos<<endl;//反向查找pos = s1.rfind('A');//等价于pos = s1.find('A', -1)if (pos == string::npos)cout<<"not found"<<endl;elsecout<<"pos="<<pos<<endl;return 0;
}
  • 测试:

在这里插入图片描述

  • replace(),构造函数(1)
    第一个参数:位置,从哪开始替换
    第二个参数:_Num1个字符被替换掉
    第三个参数:替换成_Ptr
    在这里插入图片描述
    replace(),构造函数(2)
    从_pos1开始,替换_Num1个字符,替换成_str的字符串对象
    在这里插入图片描述
    replace(),构造函数(3)
    从_pos1开始,替换_Num1个字符,要替换的字符串为:替换字符串_Ptr中的_Num2个字符
    在这里插入图片描述
    replace(),构造函数(4)
    从_pos1开始,替换_Num1个字符,替换成_Count个_Ch字符
    在这里插入图片描述
    replace(),构造函数(5)
    要替换的内容也可以是迭代器,从_Fist()开始,到_Last()为止,替换成_Ptr字符串
    在这里插入图片描述

在这里插入图片描述

  • compair(),构造函数
    与另外一个字符串对象比较,若相等则返回为0;
    若小于另外一个字符串,则返回小于;比它大,则返回大于0
    在这里插入图片描述

  • insert(),构造函数
    从_P0位置插入一个字符串_Ptr
    在这里插入图片描述

  • append(),构造函数
    追加一个_ptr字符串到末尾
    在这里插入图片描述

  • swap(),构造函数
    与另外一个字符串对象进行交换
    在这里插入图片描述

  • eg:P26\03.cpp

#include <string>
#include <iostream>
using namespace std;int main(void)
{string s1("abcdefghijkl");s1.replace(2, 2, "AAAAAA");//会改变s1cout<<s1<<end;s1 = "abcdefg";s1.replace(s1.begin()+1, s1.end()+4, "AAAAAA");cout<<s1<<end;string s2 = "xyzabc";s2.insert(2, "MMMM");//插入到z的前面cout<<s2<<endl;s2.append("6666");cout<<s2<<endl;string s3 = "111";s3.replace(s2);cout<<s2<<endl;cout<<s3<<endl;return 0;
}
  • 测试:
    在这里插入图片描述

  • 重载运算符

  • eg:P26\04.cpp

#include <string>
#include <iostream>
using namespace std;void fun(char *str)
{cout<<str<<endl;
}int main(void)
{string s1 = "abc";s1[1] = 'B';//重载[]运算符,返回指向字符的引用cout<<s1<<endl;//error, 不能给常量赋值const string s2 = "xyz";//s2[1] = 'Y';//error s2[1]返回的是const char&//字符串加法运算:前2个至少有一个是string对象string s3 = "111" + s1 + "222";cout<<s3<<endl;s3.c_str();//可以将字符串string转化为const char *//const_cast<char*>可以去掉s3.c_str()的常量性const,最终转化为char *fun(const_cast<char*>(s3.c_str()));return 0;}
  • 测试:
    在这里插入图片描述

  • find_first_of()和find_last_of()的用法,eg:P26\05.cpp

#include <string>
#include <iostream>
using namespace std;int main()
{string strinfo = " //*---Hello World!...------";string strset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";//strinfo中的H在strset字符串中出现过,返回的位置就是strinfo中H的位置string::size_type fist = strinfo.find_first_of(strset);//在strinfo字符串中,查找在strset中出现过的字符的第一个位置//第一个不在strset中的字符,就是空格// string::size_type fist = strinfo.find_first_not_of(strset);if(first == string::npos)//等于string::npos表示没有找到cout<<"not find any characters"<<endl;//最后一个不在strset中的字符,就是-// string::size_type last = strinfo.find_last_not_of(strset);string::size_type last = strinfo.find_last_of(strset);//最后一个d在strset出现的字符if (last == string::npos)cout<<"not find any characters"<<endl;cout<<strinfo.substr(first, last-first+1)<<endl;//fisrt就是H,last-first+1就是d-H+1,最后取得是:Hello Worldreturn 0;
}
  • 测试:
    在这里插入图片描述

  • eg:去除一个字符串的左右空格
    P26\06\06.cpp

#include <string>
#include <iostream>
#include "StringUtil.h"
using namespace std;int main(void)
{string s = "  abcd  ";StringUtil::LTrim(s);cout<<"["<<s"]"<<endl;s = "  abcd  ";StringUtil::RTrim(s);cout<<"["<<s>>"]"<<endl;s = " abcd ";StringUtil::Trim(s);cout<<"["<<s>>"]"<<endl;
}

P26\06\StringUtil.h

#ifndef _STRING_UTILS_H
#define _STRING_UTILS_H
#include <string>
using namespace std;class StringUtils
{
public://不需要通过对象来访问的函数,可以做成静态函数,可以通过类直接访问static void LTrim(string& s);//去除左空格的函数static void RTrim(string& s);//去除右空格的函数static void Trim(string& s);//去除空格
};#endif /* _STRING_UTILS_H */

P26\06\StringUtil.cpp

#include "StringUtil.h"void StringUtil::LTrim(string& s)
{//erase函数:第一个参数:要去除字符的位置,第二个参数:表示要去除字符的个数,这个个数就是位置string drop = " \t";//空格或者/ts.erase(0, s.find_first_not_of(drop));//从0到第一个不是空格字符,它前面的空格数,将其清除掉,范围好像是[,)
}void StringUtil::RTrim(string& s)
{string drop = " \t";s.erase(s.find_last_not_of(drop) + 1, -1);//最后一个不是空格的位置+1,就是空格的位置,一直到末尾
}void StringUtil::Trim(string& s)
{LTrim(s);RTrim(s);
}
  • 测试:
    在这里插入图片描述
  • eg:C++string去除前后空格
一、去除前空格方案1
string str = "  sshah hha    ";str.erase(str.begin(), std::find_if(str.begin(), str.end(),std::not1(std::ptr_fun(::isspace))));cout << str << endl;
方案2 string str = "  sshah hha    ";str.erase(0, str.find_first_not_of(" "));std::cout << str << std::endl;二、去除后空格方案1string str = "  sshah hha    ";str.erase(std::find_if(str.rbegin(), str.rend(),std::not1(std::ptr_fun(::isspace))).base(),str.end());cout << str << endl;
方案2 string str = "  sshah hha    ";str.erase(str.find_last_not_of(" ") + 1);std::cout << str << std::endl;三、去除前后空格方案1
string word = "  sshah hha    ";std::string::iterator end_pos = std::remove(word.begin(), word.end(), ' ');
word.erase(end_pos, word.end());//移除空格cout << word << endl;​
方案2
#include <algorithm>
#include <functional>
#include <iterator>
#include <string>string word = "  sshah hha    ";remove_if(word.begin(), word.end(), isspace);cout << word << endl;
  • 参考:C++string去除前后空格,如何在 C++ 中确定一个字符串是否是数字

这篇关于(P26)string:标准库类型,string介绍 ,string对象的定义和初始化 ,常用成员函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041379

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]