string类(下)
string类(下)
- 1.string类对象的访问及遍历操作
- 1.1operator[ ]
- 1.2begin+end
- 1.3rbegin+rend
- 1.4C++范围for
- 2.string类对象的修改操作
- 2.1push_back
- 2.2append
- 2.3operator+=
- 2.4c_str
- 2.5find
- 2.6rfind
- 2.7substr
- 2.8insert
- 2.9erase
- 2.10replace
- 3.string类非成员函数
- 3.1operator+
- 3.2operator>>
- 3.3operator<<
- 3.4getline
- 4.vs和g++string结构的说明
🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:string类对象的访问及遍历操作;string类对象的修改操作;string类非成员函数;vs和g++string结构的说明
⬆⬆⬆⬆上一篇:string类(上)
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
1.string类对象的访问及遍历操作
1.1operator[ ]
返回pos位置的字符
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
for (int i = 0; i < s.size();i++)
{
cout << s[i] <<" ";
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
for (int i = 0; i < s.size();i++)
{
s[i]='a';
cout << s[i] <<" ";
}
return 0;
}
可以看到这是个函数重载,也支持const对象
1.2begin+end
begin获取一个字符的的迭代器+end获取最后一个字符下一个位置的迭代器
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
string::iterator b = s.begin();
string::iterator e = s.end();
while (b != e)
{
cout << *b << " ";
b++;
}
cout << endl;
return 0;
}
可以暂时把它当做一个指针一样使用
其中还可以发现它也是一个函数重载,支持const,这样的话就没法修改字符串对象的有效字符了
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
const string s("hello world");
string:: const_iterator b = s.begin();
string:: const_iterator e = s.end();
while (b != e)
{
cout << *b << " ";
b++;
}
cout << endl;
return 0;
}
1.3rbegin+rend
反向迭代
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
const string s("hello world");
string:: const_reverse_iterator b = s.rbegin();
string:: const_reverse_iterator e = s.rend();
while (b != e)
{
cout << *b << " ";
b++;
}
cout << endl;
return 0;
}
1.4C++范围for
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
const string s("hello world");
for (auto i : s)
{
cout << i << endl;
}
return 0;
}
他的底层实现本质就是迭代器
2.string类对象的修改操作
2.1push_back
在字符串后面尾插字符c
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.push_back('c');
cout << s << endl;
return 0;
}
2.2append
在字符串后面追加一个字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.append("11111");
cout << s << endl;
return 0;
}
2.3operator+=
在字符串后面追加字符串或者字符
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s +="12345";
s +='c';
cout << s << endl;
return 0;
}
2.4c_str
返回C格式字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s += '\0';
s += "1111111";
cout << s.c_str() << endl;
cout << s << endl;
return 0;
}
为什么要存在c_str?因为它与直接打印的cout不同,c_str遇到’\0’会停下
2.5find
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
size_t pos=s.find('w');
cout <<s[pos] << endl;;
return 0;
}
2.6rfind
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
size_t pos=s.rfind('w');
cout <<s[pos] << endl;;
return 0;
}
2.7substr
在str中从pos位置开始,截取n个字符,然后将其返回
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
cout << s.substr(6, 5) << endl;
return 0;
}
2.8insert
在字符串中由pos指示的字符前插入附加字符
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.insert(0,"1111");
s.insert(1,1,'c');
cout << s << endl;
return 0;
}
2.9erase
擦除字符串的一部分
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.erase(5,6);
cout << s << endl;
return 0;
}
2.10replace
用新内容替换字符串中字符pos开始并跨越len个字符的部分
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
s.replace(5,1,"1111");
cout << s << endl;
return 0;
}
注意:
①一般情况下string类的+=操作符用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串
②对string操作时,如果能够大概预估防多少字符,可以先通过reserve把空间预留好
3.string类非成员函数
3.1operator+
尽量少用,因为传值返回,导致深拷贝效率低
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
cout << s +"1111" << endl;
return 0;
}
3.2operator>>
输入运算符
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
char c;
cin >> s;
cout << s << endl;
return 0;
}
3.3operator<<
这个就是常用的输出运算符
3.4getline
获取一行字符串
包含空格,直到‘\n’停止
4.vs和g++string结构的说明
在32位下,string总共占28个字节,先是一个联合体用来定string字符串的存储空间:当字符串长度小于16时,使用内部固定的字符数组来存放
当字符串长度大于等于16时,从堆上开辟空间
当string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高
其次:还有一个size_t字段保存字符串长度,一个capacity字段保存开辟空间的总容量
最后:还有一个指针做一些其他事情
故总共占16+4+4+4+4=28字节
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
cout<<sizeof(s)<<endl;
return 0;
}
g++下string的结构
g++下,string是通过写时拷贝实现的,string对象总共占4字节,内部包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:空间大小,字符串有效长度,引用计数
引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有其他对象在使用该资源。
🌸🌸string类(下)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪