首页 > 其他分享 >string简介

string简介

时间:2024-03-27 21:56:06浏览次数:27  
标签:字符 string 迭代 简介 s1 str void

C++ string类简介

C++ string类存储一个字符串,并包含多种方法

一、初始化

  • C++ string类有多种初始化方法:
  • 空初始化
  • 复制构造
  • 子串构造(下标+长度型)
  • 数组构造(接受字符数组)
  • 填充构造
void test1(){
    //空构造
    string s1;
    //拷贝构造
    string s2(s1);
    string s3 = s1;
    //数组构造
    string s4("abcdefg");
    //子串构造
    string s5(s4,3,4);
    //填充构造
    string s6(10,'a');
}

二、流插入提取操作

string类已经实现流插入和提取操作

void test2(){
    string s1("abcdefg");
    cout<<"s1:"<<s1<<endl;
    string s2;
    cin>>s2;
    cout<<"s2:"<<s2<<endl;
}
int main(){
    test2();
    return 0;
}

运行结果:

s1:abcdefg
asd
s2:asd
进程已结束,退出代码为 0
  • 需要注意的是,cin默认输入到空格和换行结束
void test3(){
    string s1;
    cin>>s1;
    cout<<s1;
}
int main(){
    test3();
    return 0;
}

运行结果:

abc def g
abc
进程已结束,退出代码为 0

可以看出,如果输入的有空格,那么cin将停止读取,只保存空格之前的字符(不包含空格)
如果想要保存整个一行的内容,需要用到方法getline

void test4(){
    string s1;
    getline(cin,s1);
    cout<<s1<<endl;
}
int main(){
    test4();
    return 0;
}

运行结果:

abc def g
abc def g
进程已结束,退出代码为 0

二、迭代器

string类,以及C++其它容器,都具有迭代器 。
可以把迭代器想象是指向容器单个元素的指针,并且可以顺序得遍历容器元素。
迭代器可以分为以下4类:

  • 正向迭代器
  • 逆向迭代器
  • 常正向迭代器
  • 常逆向迭代器

1.正向迭代器

void test5(){
    string s1("abcdefgh");
    for(auto i = s1.begin();i!=s1.end();i++){
        cout<<*i<<'&';
    }
    cout<<endl;
    for (auto i = s1.end(); i != s1.begin() ; --i) {
        cout<<*i<<'*';
    }
    cout<<endl;
}
int main(){
    test5();
    return 0;
}

运行结果:

a&b&c&d&e&f&g&h&
 *h*g*f*e*d*c*b*

进程已结束,退出代码为 0

从上可以看出,正向迭代器从begin到end是一个左闭右开的范围,且迭代器之间最好不要写大于小于号,
因为除了string这样可能是连续存储,其它容器可能是非连续存储,大于小于无法用于判别谁先谁后

2.逆向迭代器

void test6(){
    string s1("abcdefgh");
    for(auto i = s1.rbegin();i!=s1.rend();i++){
        cout<<*i<<"&";
    }
    cout<<endl;
    for(auto i = s1.rend();i!=s1.rbegin();i--){
        cout<<*i<<"*";
    }
    cout<<endl;
}
int main(){
    test6();
    return 0;
}

运行结果:

h&g&f&e&d&c&b&a&
 *a*b*c*d*e*f*g*

进程已结束,退出代码为 0

同样是左闭右开

3.常迭代器

常迭代器类似于迭代器,只不过不能常迭代器修改指向元素

三、内存空间操作

string类包含很多关于容量的方法

  • size() 返回字符串存储空间大小
  • length() 返回字符串长度
  • resize(size_t n,char c=null) 将字符串长度变成n,但不改变存储容量,如果n大于字符串长度,那么将以字符c填充,如果未指定c,那么以null填充
  • capacity() 返回存储空间大小
  • reserve(size_t n=0)为字符串空间预留大小为n的空间,避免多次扩容,提高效率
  • clear() 删除字符串,但保留存储容量
  • empty() 测试字符串是否为空
  • shrink_to_fit() 使存储容量调整至字符串大小

四、取值操作

string类重载了[ ]运算符,使string可以和字符数组一样使用

void test7(){
    string s1("abcdefgh");
    for (int i = 0; i < s1.length(); ++i) {
        cout<<s1[i]<<' ';
    }
    cout<<endl;
}
int main(){
    test7();
    return 0;
}

运行结果:

a b c d e f g h

进程已结束,退出代码为 0

五、增、删、查操作

1.增

字符串的增加可以是连接,插入(头、中)
连接:

重载+、+=符号

void test8(){
    string s1("hello");
    string s2 = s1 + ' ' + "world";
    cout<<s2<<endl;
    s2 += "233";
    cout<<s2<<endl;
}
int main(){
    test8();
    return 0;
}

运行结果:

hello world
hello world233

进程已结束,退出代码为 0

可以实现字符串的拼接和赋值

append()

void test9(){
//    以字符串为参数
    string s1("hello");
    s1.append(" world");
    cout<<"s1:"+s1<<endl;

//    以string类为参数
    string s2;
    s2.append(s1);
    cout<<"s2:"+s2<<endl;

//    以字符串为参数,并声明长度
    string s3("hello");
    s3.append(" world",4);
    cout<<"s3:"+s3<<endl;
    
//    以string类为参数,并声明开始位置和长度
    string s4;
    s4.append(s2,6,5);
    cout<<"s4:"+s4<<endl;
//    指定拼接字符个数,拼接字符
    string s5;
    s5.append(10,'c');
    cout<<"s5"+s5<<endl;
//    以string迭代器区间为参数
    string s6;
    s6.append(++s5.begin(),--s5.end());
    cout<<"s6:"+s6<<endl;    
}
int main(){
    test9();
    return 0;
}

运行结果:

s1:hello world
s2:hello world
s3:hello wor
s4:world
s5:cccccccccc
s6:cccccccc

进程已结束,退出代码为 0

push_back(char c) 尾插字符c

insert()

我们大致能知道,
插入的位置可以是

  • 下标索引
  • 迭代器

插入内容可以是

  • (n个)字符
  • 字符串、字符串子串
  • string类、string的迭代器区间

删除string中的一个字符或一段字符,可以是下标+长度,也可以是迭代器(区间)。

pop_back() 尾删

erase()

void test10(){
    char str[] = "hello world";
    string s1(str);
    s1.erase(3);//从下表3开始删到最后
    cout<<"s1:"+s1<<endl;

    string s2(str);
    s2.erase(3,4);//从下标3开始删4个字符
    cout<<"s2:"+s2<<endl;

    string s3(str);
    s3.erase(++s3.begin());//删掉第二个元素
    cout<<"s3:"+s3<<endl;
    s3.erase(--s3.end());//删掉最后一个元素
    cout<<"s3:"+s3<<endl;

    string s4(str);
    s4.erase(++(s4.begin()),--s4.end());//删掉左闭右开的区间
    cout<<"s4:"+s4<<endl;
}
int main(){
    test10();
    return 0;
}

运行结果:

s1:hel
s2:helorld
s3:hllo world
s3:hllo worl
s4:hd

进程已结束,退出代码为 0

查找第一个出现的字符,返回下标

find()

void test11(){
    char str[] = "hello world";
    string s1(str);
    cout<<s1.find('e')<<endl;//从头开始找字符e

    cout<<s1.find('w',3)<<endl;//从下标3开始找

    cout<<s1.find("world",0,3)<<endl;//从下标0开始找和字符串前3个字符匹配的字符起始位置

}
int main(){
    test11();
    return 0;
}

运行结果:

1
6
6

进程已结束,退出代码为 0

至于剩下的几种查找函数:

  • rfind() 逆向查找
  • find_first_of(str) 找到string和str中任意字符匹配的第一个字符
  • find_last_of(str) 找到string和str中任意字符匹配的倒数第一个字符
  • find_first_not_of(str) 找到string和str中任意字符不匹配的第一个字符
  • find_last_not_of(str) 找到string和str中任意字符不匹配的倒数第一个字符

子串

substr(size_t pos=0,size_t len = npos)

pos指的是子串开始下标,npos默认指的是到字符串最后一位,若提供len = n,则从pos开始复制n个字符
到子串

六、兼容C部分

C语言中没有string类,C++提供了c_str()方法将string转化为C语言字符数组

void test12(){
    char str[] = "hello world";
    string s1(str);
    //printf("%s",s1);//error
    printf("%s\n",s1.c_str());
}
int main(){
    test12();
    return 0;
}

运行结果:

hello world

进程已结束,退出代码为 0

标签:字符,string,迭代,简介,s1,str,void
From: https://www.cnblogs.com/saopigqwq233/p/18100357

相关文章

  • 【C++】string类(常用接口)
     ......
  • HTML 简介
    ​ HTML(HyperTextMarkupLanguage,中文:超文本标记语言)是一种用于创建网页结构和内容的标记语言。它由一系列标签组成,这些标签描述了网页中的各个元素和其它相关信息。通过使用HTML标签和属性,开发人员可以定义文本、图像、链接、表格、表单等元素,并控制它们的外观和行为。本文主......
  • python笔记(3)基本数据类型简介
    目录python3的六个标准数据类型Numbers(数字) 数值运算String(字符串)List(列表)Tuple(元组)Sets(集合)set()函数有两用方式使用set运算Dictionaries(字典)python3的六个标准数据类型Numbers(数字)String(字符串)List(列表)Tuple(元组)Dictionaries(字典)Set(集合)......
  • 精准化测试原理简介
    小时候大家应该都玩过一个游戏,游戏很简单,就是找不同,在规定时间内两幅图直接的差异点找到就算赢,越快越好,就像下面这样:上面这个不同点想找很简单,那么下面这样的呢?这个,确实有的人会说"我可以!"。比如在综艺节目"最强大脑"中,这群"变态"的非人类确实可以反正我不行,我也不信你们看到......
  • WPF StringFormat在Label控件无效
    在WPF程序设计时,若使用Label控件绑定数据后StringFormat进行格式化显示时发现设定的StringFormat无效,但TextBlock控件中使用StringFormat显示正常,导致Label控件StringFormat失败的根本原因在于Label控件的Content属性是一个object对象,Binding.StringFormat仅作用于string类型属性......
  • Vue学习笔记64--路由简介
    路由简介 路由就是一组key-value的对应关系多个路由,需经过路由器进行管理SPA应用:singlepagewebapplication(单页面web应用)Vue-router一:相关理解vue-router:vue的一个插件库(需安装--npminstallvue-router--save),专门用来实现SPA应用对SPA应用的理解singlepa......
  • react零基础到精通-1|基础概念,主要特性,s6语法,react相关的开发环境和工具,react简介,箭头
    致力于解决复杂视图层开发我呢提,全新的ui组件的开发理念,1.1React简介前端UI的本质问题是如何将来源于服务器端的动态数据和用户的交互行为高效地反映到复杂的用户界面上。React另辟蹊径,通过引入虚拟DOM、状态、单向数据流等设计理念,形成以组件为核心,用组件搭建UI的开发......
  • 嵌入式笔记1.1 ARM Cortex-M3M4简介
    目录微型计算机的硬件共性结构及基本性能指标关于存储器的介绍微型计算机的基本性能指标1.字长2.主频3.存储容量4.外设扩展能力5.软件配置情况ArmCortex系列微处理器系列概述ArmCortex-A系列处理器ArmCortex-R系列处理器ArmCortex-M系列处理器Cortex-M3和Cortex-M......
  • 封装之打线简介
    https://developer.aliyun.com/article/7403181.Wire bond原理:对金属丝和压焊点同时加热和超声波,接触面便产生塑性变形,并破坏了界面的氧化膜,使其活性化,通过接触面两金属之间的相互扩散,形成金属化合物而完成连接。2.常用线材:金线,Ag合金线,钯铜线,纯铜线。基于0.8mil,20um各种......
  • .NET Core 简介
       微软于2016年推出了新一代的开发平台,并且将其命名为.NETCore。相较于旧的.NETFramework。.NETCore有如下优点:  1).NETCore采用模块化开发。不再像.NETFramework那样需要安装整个安装包。.NETCore核心只包含很少的文件,所有其他模块都需要单独安装。根据需要引用......