C++学习————第十天(string的基本使用)

1、string 对象类的常见构造  

(constructor)函数名称                      功能说明:
string() (重点)                                 构造空的string类对象,即空字符串
string(const char* s) (重点)            用C-string来构造string类对象
string(size_t n, char c)                        string类对象中包含n个字符c
string(const string&s) (重点)          拷贝构造函数

void test_string1() {//常用string s1; //定义string s2("hello world"); //拷贝构造string s3(s2);//不常用 了解
//从s2的第三个字符开始拷贝,拷贝5个字符,如果5大于后面的字符数,到'\0'停止string s4(s2, 3, 5);string s5(s2, 3); //从s2的第三个字符开始拷贝string s6(s2, 3, 30);string s7("hello world", 5);string s8(10, 'x');cout << "s1 = " << s1 << endl;cout << "s2 = " << s2 << endl;cout << "s3 = " << s3 << endl;cout << "s4 = " << s4 << endl;cout << "s5 = " << s5 << endl;cout << "s6 = " << s6 << endl;cout << "s7 = " << s7 << endl;cout << "s8 = " << s8 << endl;
}

2、string的隐式类型转换和构造

void test_string2()
{string s1("hello world"); //构造string s2 = "hello world"; //隐式类型转换const string& s3 = "hello world";// 临时对象具有常性,加const}

3、string类对象的容量操作

void test_string3()
{string s1("hello world");cout << s1.size() << endl;
//capacity 比 实际空间少一个,有一个多的是预留给\0cout << s1.capacity() << endl;cout << s1.max_size() << endl;
}

4、string的遍历

void test_string4() {// 遍历方式:下标 + []string s1 = "hello world";for (int i = 0; s1[i]; i++){cout << s1[i] << " ";}cout << endl;//遍历方式2:迭代器string::iterator it1 = s1.begin();while (it1 != s1.end()) { cout << *it1 << " ";++it1;}cout << endl;cout << typeid(it1).name() << endl;//遍历方式3:范围for// 底层:就是迭代器for (auto e : s1) {cout << e << " ";}
}

注意:迭代器中的begin和end

5、reverse逆置

void test_string5() //反向迭代器
{string s1("hello world");string::const_iterator it1 = s1.begin();//auto it1 = s1.begin();while (it1 != s1.end()){//*it1 += 3;// 不能修改cout << *it1 << " ";++it1;}string s2("hello world");string::reverse_iterator it2 = s2.rbegin();while (it2 != s2.rend()) {*it2 += 3;cout << *it2 << " ";++it2;}
}

6、const

7、sort排序

void test_string6()
{string s1("hello world");cout << s1 <<endl;//按字典序排序sort(s1.begin(), s1.end());//第一个和最后一个参与排序sort(++s1.begin(), --s1.end());//前五个排序sort(s1.begin(), s1.begin() + 5);cout << s1 << endl;
}

8、插入删除

a、push_back、append的后插

void test_string7()
{string s1("hello world");cout << s1 << endl;s1.push_back('x');cout << s1 << endl;s1.append(" yyyyyy!! ");cout << s1 << endl;s1 += 'z';s1 += "wwwwww";cout << s1 << endl;
}

b、insert插入、erase删除

    s.insert(1, "111");//在1位置后插入111 
    s.erase(1, 2);//从1位置开始删两个

9、resize和reserve

注意:

resize :    影响size  、capacity

reserve : 只影响capacity

void test_string11()
{string s1;s1.resize(5, '0'); //初始值cout << s1 << endl;// 再扩容s1.reserve(100);cout << s1.size() << "  " << s1.capacity() << endl;//reserve 在vs下不会缩容,没有规定s1.reserve(20);cout << s1.size() << "  " << s1.capacity() << endl;s1.resize(10);cout << s1.size() << "  " << s1.capacity() << endl;s1.resize(120);cout << s1.size() << "  " << s1.capacity() << endl;//由此发现resize影响capacity、size(当再开辟空间大于原先capacity才会影响capacity), reserve不影响size//插入(空间不够扩容)string s2("hello world");s2.resize(20, 'x'); //不会清掉之前的字符,在后面填写cout << s2 << endl;// 删除s2.resize(5); 
}

10、查找

a、find、rfind

find     : 从前往后查找,并且返回所在下标

rfind    : 从后往前查找

substr : 获得子串

void test_string12()
{string s = "aabaabaab";cout << s.find("aa") << endl;//查找字符串“aa”首次出现位置 0cout << s.find("aa", 3) << endl;//查找下标3开始(即第四个字符开始)字符串“aa”首次出现位置  3cout << s.find('a') << endl;//查找字符串'a'首次出现位置  0cout << s.find('a', 3) << endl;//查找下标3开始(即第四个字符开始)字符串“aa”首次出现位置  3cout << s.rfind("aa") << endl;//查找字符串“aa”最后一次出现位置  6
}

b、查找第一个大于或大于等于的字符

x=lower_bound(b+1,b+m+1,y)-b;//从[first,last)中找第一个大于等于y的元素的地址,-b是转化为下标
x=upper_bound(b+1,b+m+1,y)-b;//同理,只不过找第一个大于的

c、查找某一字符串中任意字符首次/末次出现位置

cout << s.find_first_of("hark") << endl;
cout << s.find_last_of("a") << endl;

d、查找不是某一字符串中字符的首次/末次出现位置

    cout << s.find_first_not_of("hark") << endl;
    cout << s.find_last_not_of("hark") << endl;

11、c_str

1、用处可以用在文件使用上,如:

// 文件操作
void TestFile()
{string file("test.cpp");FILE* fout = fopen(file.c_str(), "r");//.c_str()作用是吧一个string串转换成一个C - style的串,// 以"/0"null character结尾,返回的是一个指向该C - style串的常指针。char ch = fgetc(fout);while (ch != EOF){cout << ch;ch = fgetc(fout);}
}

2、c_str比较

void test_string13()
{string a = "abc";string b = a;//a.c_str() == b.c_str()比较的是存储字符串位置的地址,// a和b是两个不同的对象,内部数据存储的位置也不相同,因此不相等if (a.c_str() == b.c_str())cout << "True" << endl;else cout << "False" << endl;
}

12、substr 取子串

  1. str = str.substr(cnt); //取从cnt下标开始一直到结束的所有字符

  2. str = str.substr(cnt,m); //取从cnt下标开始的m个字符

13、字符串与数字的相互转化

a、字符串转数字

  1. string s="12";

  2. int y=stoi(s);

b、数字转字符串

     string x=to_string(12);

14、大小写转化

transform(s.begin(),s.end(),s.begin(),::tolower);
transform(s.begin(),s.end(),s.begin(),::toupper);

15、sizeof 和strlen在char*和string中的使用

void test_string17()
{char buff1[] = "abcd";char buff2[] = "瓦特";string s1("abcd");cout << sizeof(buff1) << endl; // 5, '\0'算一个字节cout << sizeof(buff2) << endl; // 5,一个汉字两个字节,'\0'算一个字节cout << sizeof(s1) << endl; // 40cout << strlen(buff1) << endl; // 4cout << strlen(buff2) << endl; // 4,一个汉字两个字节//cout << strlen(s1) << endl; // 不能计算
}

16、string的底层实现

类域定义:

namespace bit
{class string {public: //迭代器实现typedef char* iterator;iterator begin();iterator end();//string(); //无参构造//string(const char* str);string(const char* str = ""); //全缺省~string();const char* c_str() const;size_t size() const; //长度char& operator[](size_t pos); //打印private:// char _buff[16];char* _str;size_t _size;size_t _capacity;};
}

函数实现:

namespace bit
{//string::string() //{//	_str = new char[1] {'\0'};//	_size = 0;//	_capacity = 0;//}string::iterator string::begin() {return _str;}string::iterator string::end(){return _str + _size;}string::string(const char* str):_str(new char[strlen(str) + 1]), _size(strlen(str)), _capacity(strlen(str)){strcpy(_str, str);}string::~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}const char* string:: c_str() const{return _str;}size_t string::size() const{return _size;}char& string::operator[](size_t pos){assert(pos < _size);return _str[pos];}}

函数测试:

namespace bit{void test_string1(){bit::string s1("hello world");cout << s1.c_str() << endl;bit::string s2;cout << s2.c_str() << endl;for (size_t i = 0; i < s1.size(); i++){s1[i]++;cout << s1[i] << " ";}cout << endl;//封装:屏蔽了底层实现细节,提供了一种简单通用访问容器的方式string::iterator it1 = s1.begin();while (it1 != s1.end()){cout << *it1 << " ";++it1;}cout << endl;//范围for底层也是迭代器for (auto e : s1){cout << e << " ";}cout << endl;}
}



string相关题型:

1、字符串相加

2、仅仅反转字母

3、字符串中第一个唯一字符

4、字符串中最后一个单词长度

5、验证回文串

6、字符串相加

7、反转字符串II

8、反转字符串III

9、字符串相乘

10、找出字符串中第一个只出现一次的字符

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

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

相关文章

PostgreSQL的学习心得和知识总结(一百四十一)|深入理解PostgreSQL数据库数据库角色的使用及预定义角色的原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

Mysql 基础 - 常见 子句

算数运算符 > < > < !/<> 逻辑运算符 3i in is null is not null 2l limit like 2o or 、order by 1a and ib between and 1n not and、or 、not、 in、 orderby、 limit、 like、 between...and、 is null 、is not null

【C++】C++11--- 列表初始化|关键字

目录 前言 列表初始化 创建对象时的列表初始化 单参数隐式类型转换 多参数的隐式类型转换 new表达式中使用列表初始化 列表初始化适用于STL 容器 模板类initializer_list 关键字auto 关键字decltype 关键字nullptr 前言 C标准10年磨一剑&#xff0c;第二个真正意义上…

学习软考----数据库系统工程师20

数据库技术基础 主要内容如下&#xff1a; DBMS的功能和特点 课本上&#xff1a; 数据库系统的三级模式结构 数据模型 E-R图

AI讲师大模型培训老师叶梓:大模型应用的方向探讨

大模型应用的关键方向及其落地案例可以从多个角度进行探讨&#xff0c;结合最新的研究和实际应用案例&#xff0c;我们可以更全面地理解这些技术如何推动社会和经济的发展。 Agent&#xff08;数字代理&#xff09;: 方向说明:Agent方向的AI技术旨在创建能够独立执行任务、做出…

Git系列:Git Stash临时保存与恢复工作进度

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

掌控网络流量,优化网络性能 - AnaTraf网络流量分析仪登场

在当今日新月异的网络环境中,网络流量监控和性能诊断已成为企业IT部门不可或缺的重要工作。只有充分了解网络流量状况,才能有效优化网络性能,提高业务运营效率。针对这一需求,全新推出的AnaTraf网络流量分析仪应运而生,为企业提供全面的网络监控和性能诊断解决方案。 快速定位…

嵌入式Linux的QT项目CMake工程模板分享及使用指南

在嵌入式linux开发板上跑QT应用&#xff0c;不同于PC上的开发过程。最大的区别就是需要交叉编译&#xff0c;才能在板子上运行。 这里总结下嵌入式linux环境下使用CMake&#xff0c;嵌入式QT的CMake工程模板配置及如何使用&#xff0c;分享给有需要的小伙伴&#xff0c;有用到的…

在做题中学习(50):搜索插入位置

35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;题目是有序的&#xff0c;时间复杂度O(logN),二分没跑了&#xff0c;题目说如果找不到target&#xff0c;返回它应该被插入位置的下标&#xff0c;所以可以分析一下示例2&…

后教培时代的新东方,正在找寻更大的教育驱动力?

近段时间&#xff0c;K12教育主要上市公司的阶段性业绩皆已出炉。从具体数据来看&#xff0c;随着时间推移&#xff0c;教培机构的转型之路已愈走愈顺。 财报显示&#xff0c;2023年12月1日-2024年2月29日&#xff0c;好未来实现营收4.3亿美元&#xff0c;同比增长59.7%&#…

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版是一款强大的虚拟机软件&#xff0c;支持多操作系统&#xff0c;提供卓越的虚拟化技术&#xff0c;确保流畅稳定的运行。新增特色功能如共享打印、TouchID集成等&#xff0c;提供便捷高效的虚拟机体验。界面美观现代&…

认识大模型提示词

一、写作助理 &#x1f4a5;最常使用的 prompt&#xff0c;用于优化文本的语法、清晰度和简洁度&#xff0c;提高可读性。 输入&#xff1a;作为一名写作改进助理&#xff0c;你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性&#xff0c;同时分解长句&#xff…

Google Earth Engine谷歌地球引擎计算遥感影像在每个8天间隔内的多年平均值

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;求取多年时间中&#xff0c;遥感影像在每1个8天时间间隔内的多年平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;系列教学文章…

[机器学习-01]一文了解|机器学习简介、工具选择和Python包基础应用

目录 前言 正文 01-机器学习简介 &#xff08;1&#xff09;诞生过程 &#xff08;2&#xff09;人工智能、机器学习和深度学习之间的关系 &#xff08;3&#xff09;机器学习核心 02-机器学习工具 &#xff08;1&#xff09;Anaconda简介 &#xff08;2&#xff09;Jupyte…

【千帆平台】使用AppBuilder零代码创建应用,Excel表格数据转为Markdown格式文本

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用名称应用描述应用头像角色指令组件能力开场白推…

springcloud报错:Failed to start bean‘webServerStartStop‘

如果你正在使用nacos进行服务注册&#xff0c;然后报一下错误&#xff1a; 那就说明的nacos没有打开&#xff0c;所以找到你的下载nacos的文件夹 好了&#xff0c;错误完美解决~

Leetcode—387. 字符串中的第一个唯一字符【简单】

2024每日刷题&#xff08;127&#xff09; Leetcode—387. 字符串中的第一个唯一字符 实现代码 class Solution { public:int firstUniqChar(string s) {int count[26] {0};for(char c: s) {count[c - a];}for(int i 0; i < s.length(); i) {if(count[s[i] - a] 1) {re…

射频无源器件之耦合器

一. 耦合器的作用 在射频电路中,射频耦合器将一路微波功率按比例分成几路,用于检测或监测信号,如功率测量和波检测,还可改变信号的幅度、相位等特性,以满足不同的通信需求。根据输入与耦合端的功率差,常被分为5dB、6dB、10dB等耦合器。射频耦合器的类型主要包括定向耦合…

OSPF Stub区域

原理概述 OSPF 协议定义了多种区域&#xff08; Area &#xff09;类型&#xff0c;其中比较常见的有 Stub 区域和 Totally Stub 区域。区域的类型决定了在这个区域当中所存在的 LSA 的类型。 Stub 区域不允许 Type-4和 Type-5 LSA 进入&#xff0c;该区域会通过 Type-3 LSA…

BFS专题——FloodFill算法:200.岛屿数量

文章目录 题目描述算法原理代码实现CJava 题目描述 题目链接&#xff1a;200.岛屿数量 PS:注意题目中每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。也就是说斜角是不算了&#xff0c; 例如示例二&#xff0c;是三个岛屿。 算法原理 这道题目是 DFS&#xff0…