当前位置: 首页 > news >正文

stl之string

 构造函数

void test1()
{string s1;//不传参cout << s1 << endl;string s2("123456");cout << s2 << endl;string s3(s2);cout << s3 << endl;string s4(s2, 1, 5);cout << s4 << endl;string s5("123456", 2);cout << s5 << endl;string s6(8, 'c');cout << s6 << endl;
}
int main()
{test1();return 0;
}

第三种情况最后一个是缺省值,如果没有传第三个参数默认从pos位置开始一直复制到最后

赋值

void test3()
{string s1="hello";
const string& s2="world";//隐式类型转换
}

size和capacity

void test2()
{string s1("111111");cout << s1.size() << endl;cout << s1.capacity() << endl;cout << s1.max_size() << endl;
}
int main()
{test2();return 0;
}

 max_size没什么用,实际上也不会扩容到这么多空间,其实length在这里和size的用、作用是一致的,但length只能用于stl的部分容器,所以我们之后统一用size

[ ]运算符

我们可以直接使用下标来访问

	for (int i = 0; i < s1.size(); i++){//cout << s1.operator[](i) << " " ;cout << s1[i] << " ";}

 两者是等价的

迭代器:iterator

begin:任何容器返回第一个数据位置的iterator

end:任何数据返回最后数据的下一个位置的iterator

 迭代器第二种情况是当string的对象是常量时,迭代器指向的数据不能写(但迭代器是可以修改的)

遍历string:

void test4()
{string s1("hello world");//遍历方式1,下标for (int i = 0; i < s1.size(); i++){cout << s1[i];}cout << endl;//遍历方式2,迭代器//string::iterator j = s1.begin();auto j = s1.begin();while (j != s1.end()){//(*j) += 3;可以修改值cout << *j ;j++;}cout << endl;//遍历方式3,范围for,底层来看,还是迭代器for (auto e : s1){cout << e;}cout << endl;
}

 const修饰后的遍历

void test5()
{const string s1("hello world");string::const_iterator j = s1.begin();//auto j = s1.begin();while (j < s1.end()){cout << *j;j++;}cout << endl;
}

 rbegin和rend

本质上和begin和end相同,但是是逆置后的,用法也相似

void test6()
{string s1("hello world");string::reverse_iterator j = s1.rbegin();while (j != s1.rend()){cout << *j;j++;}
}

排序

按字典序排序

void test7()
{string s1("hello world");sort(s1.begin(), s1.end());//对对应的位置排序cout << s1;
}

 +=

类似于c语言中的strcat,但这里就不用考虑s1能不能存的下的问题了

void test8()
{string s1("11111");string s2("22222");s1 += s2;cout << s1;
}

 append:

这里结构和之前的构造是一致的,功能是进行尾插一段字符串 

insert:

void test9()
{string s1("tired");
string s2("222222");
//单个字符char sh = 'x';s1.insert(s1.begin(), sh);cout << s1 << endl;	
//迭代器实现
s2.insert(s2.begin(), s1.begin(), s1.end());cout << s2 << endl;
}

insert的处理起来时间复杂度是O(N),实际上也很少用这个函数

void test10()
{string s1("hello world");//s1.erase(1,2);s1.erase(s1.begin(), s1.end());cout << s1 << endl;
}

erase: 

 erase效率和insert差不多,一种迭代器实现,一种是从pos位置开始删除len长度个字符

resize: 

reserve: 

void test12()
{string s1("hello world");//提前开好空间s1.reserve(63);cout << s1.capacity() << endl;s1.resize(20,'x');cout << s1.capacity() << endl;
}
resize的n比capacity大时,capacity也会自动扩容,如果第二个参数是字符,会自动补充,如果没有,会补充空字符

c_str() 

void test13()
{//c_str兼容cstring file("test.cpp");
FILE* out = fopen(file.c_str(), "r");
char ch= fgetc(out);
while (ch != fgetc(out))
{cout << ch;ch = fgetc(out);
}

 因为C++兼容C,所以进行读写文件的时候有c_str这个函数

 

find和rfind 

 

简单来说,find是从前往后找到第一次发现的字符,rfind是从后往前找 

find_first_of,find_last_of

 

 与find和last相比,这两个是找一个字符串中任意一个字符匹配的位置,第一个是从前往后找,第二个是从后往前找

 如下一段代码,windows和linux下都能查找对应代码路径和文件

	void SplitFilename(const string& str){cout << "Splitting: " << str << '\n';size_t found = str.find_last_of("/\\");cout << " path: " << str.substr(0, found) << '\n';cout << " file: " << str.substr(found + 1) << '\n';}int main(){std::string str1("/usr/bin/man");std::string str2("c:\\windows\\winhelp.exe");SplitFilename(str1);SplitFilename(str2);return 0;}

substr:截取一段子串

getline 

可以具有cin的功能,但是有cin遇到空格就不再提取,而getline是遇到换行不再提取,也可以指定特殊字符 

to_string:将自定义类型转换为string类型 

 

string的capacity扩容

vs上是1.5倍扩容,capacity比实际空间少一个,有一个多的是预留给'\0'的

当字符串长度小于16时,使用内部固定的字符数组来存放 当字符串长度大于等于16时,从堆上开辟空间

	void test17(){string s;size_t sz = s.capacity();cout << "initial capacity " << sz << endl;for (int i = 0; i < 100; i++){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz<<endl;}}}

http://www.lryc.cn/news/385665.html

相关文章:

  • Vue3学习笔记<->nginx部署vue项目
  • 使用 WebGL 创建 3D 对象
  • 百度地图3d区域掩膜,最常见通用的大屏地图展现形式
  • 小区物业管理收费系统源码小程序
  • C++实现一个简单的Qt信号槽机制
  • 微信小程序常用的传值
  • SQL面试真题解答 数据统计分析,求“同比、环比”等(SQL窗口函数使用)
  • 【递归、搜索与回溯】floodfill算法二
  • Dataease安装,配置Jenkins自动部署
  • 关于IDEA启动报错 【JAVA_HOME does not point to a valid JM installation】
  • 设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性
  • Oracle中的序列(Sequence)是一种数据库对象
  • 热点观察 | 《姜饼人王国》新作来袭、《Monopoly GO!》荣登5月全球畅销榜榜首
  • 智能网络构建:探索大模型在网络领域的应用
  • C++编程逻辑讲解step by step:定义一个Person类,它的每个对象表示一个人。
  • DBdoctor产品介绍
  • 一加Ace3 刷机救砖简化说明
  • 【服务器05】之【登录/注册账号成功转至游戏场景】
  • 平价蓝牙耳机推荐性价比高,性价比高的蓝牙耳机学生党推荐
  • 【华为战报】5月、6月HCIP考试战报!
  • OBD诊断
  • Elasticsearch 聚合查询
  • adb remount fails - mount: ‘system‘ not in /proc/mounts 解决办法
  • 百元蓝牙耳机推荐2024哪个好?蓝牙耳机性价比之王推荐
  • Spring项目报错解读与全部报错详解
  • 10秒教会你mysql的连接
  • 万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练
  • OpenCv形态学(一)
  • CSS基础汇总
  • cocos creator让所有button点击时播放音效