那些年我与c++的交友日记(初识三):string类的(详细)常用函数与补充三种string遍历方式

本文主要是介绍那些年我与c++的交友日记(初识三):string类的(详细)常用函数与补充三种string遍历方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

备注:我所讲的只是我学到的1/10(只可意会不可言传啊,苦笑),如有不对的地方,请留言,我们一起讨论!

引子:了解string需要了解stl

    STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架! 可以说(我认为),STL是区分c语言与c++语言的最大区别!

比较流行的二种版本! P. J. 版本与SGI版本:

 P. J. 版本 由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用(即VS),不能公开或修改,缺陷:可读性比较低, 符号命名比较怪异。SGI版本 由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好, 可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。

注意:二种版本有70%相同,但也有很大区别!比如:在利用reserve时G++支持开capacity为10的空间,但是VS不行!,VS有内置的一个数组!

补充说明:string三种遍历方式

一,利用operator[]的方式!二,利用迭代器!三,范围for(关键字:atuo)

string s1("hello world");
// 遍历方式1:下标+[](注意可以修改!)
for (size_t i = 0; i < s1.size(); i++)
{
    cout << s1[i] << " ";
}
cout << endl;
//遍历方式2: 迭代器
auto it1 = s1.begin();
while (it1 != s1.end())
{
    cout << *it1 << " ";
    ++it1;
}
cout << endl;
//遍历方式3: 范围for
// 底层角度,他就是迭代器
for (auto& e : s1)
{
    cout << e << " ";
}
cout << endl;

反向遍历:

string::reverse_iterator it2 = s1.rbegin();
while (it2 != s1.rend())
{
    cout << *it2 << " ";
    ++it2;
}
cout << endl;

String类

标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性。

......OK,话不多说我们进入正题--string类的常用函数一!

String--Member functions

这部分包括:构造,析构,=的运算符重载!

构造:有如下情况,注意npos是最大数,当字符串长度小于要打印或为npos时即为全部打印!

=的运算符重载!    (隐式类型转化!非常重要)

补充:// 隐式类型转换

string s2 = "hello world";

const string& s3 = "hello world";

比较代码:

int main ()
{std::string str1, str2, str3;str1 = "Test string: ";   // c-stringstr2 = 'x';               // single characterstr3 = str1 + str2;       // stringreturn 0;
}

String--Capacity

注意:1size 与length功能一样,都是返回字符串的长度(公共成员函数) (重点)

2,max_size返回字符串的最大大小(公共成员函数)

注意:一般编译器开不到这么大的空间!

3,resize调整字符串存储的大小(公共成员函数)(重点)

4,capacity返回已分配存储的大小(公共成员函数)(重点)

注意:改变capacity不影响size大小,如访问要判断是否越界情况!

5,reserve请求更改容量(公共成员函数)(重点)

注意:Liux与g++不同,G++支持开capacity为15及以下的空间,但是VS不行!,VS有内置的一个数组,不支持缩容!Liux一般开多少就是多少!

AS:代码:

string s;

// 知道需要多少空间,提前开好

s.reserve(200);

6,clear清除有效字符串(公共成员函数)

复习:operator new与operator delete的相关知识!以及operator (*p)new[]的显示调用构造函数的用法!

7,empty测试字符串是否为空(公共成员函数)是返回true,否则返回false(重点)

Steing--Element access

比较简单,一笔带过!代码解析如下:

String--Modifiers

operator+=,append,push_back用法!

string s1("hello world");
cout << s1 << endl;
s1.push_back('x');


/*push_back用法:string(1)
    string& append(const string & str);
substring(2)
    string& append(const string & str, size_t subpos, size_t sublen);
c - string(3)
    string & append(const char* s);
buffer(4)
    string& append(const char* s, size_t n);
fill(5)
    string& append(size_t n, char c);
range(6)
    template <class InputIterator>
string& append(InputIterator first, InputIterator last);*/
cout << s1 << endl;
s1.append(" yyyyyy!!");
/*append()用法* string(1)
    string& append(const string & str);
substring(2)
    string& append(const string & str, size_t subpos, size_t sublen);
c - string(3)
    string & append(const char* s);
buffer(4)
    string& append(const char* s, size_t n);
fill(5)
    string& append(size_t n, char c);
range(6)
    template <class InputIterator>
string& append(InputIterator first, InputIterator last);*/


cout << s1 << endl;


string s2("111111");
s1 += 'y';//(char c)
s1 += "zzzzzzzz";//(const char* s);
s1 += s2;//string& operator+= (const string& str);
cout << s1 << endl;

assign,insert相关代码示例

s1.assign("111111");

cout << s1 << endl;

// 慎用,因为效率不高 -> O(N)

// 实践中需求也不高

string s2("hello world");

s2.insert(0, "xxxx");

cout << s2 << endl;

char ch = 'y';

cin >> ch;

s2.insert(0, 1, ch);

cout << s2 << endl;

s2.insert(s2.begin(), 'y');

cout << s2 << endl;

s2.insert(s2.begin(), s1.begin(), s1.end());

cout << s2 << endl;

注意:

其他:与之前类似,大家可自行参悟!

erase擦除删除字符串中的字符(公共成员函数)replace替换字符串的一部分(公共成员函数)Swap字符串值(公共成员函数)pop_back删除最后一个字符(公共成员函数)

今天就到这里啦!但是我所讲的只是我学到的1/10,下次我将分享的更加详细,请大加多多支持!

这篇关于那些年我与c++的交友日记(初识三):string类的(详细)常用函数与补充三种string遍历方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R