> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。
> 目标:熟悉string库
> 毒鸡汤:人生就像一场旅行,不在乎目的地,而在乎沿途的风景以及看风景的心情。
> 望小伙伴们点赞👍收藏✨加关注哟💕💕
🌟前言
学习这个板块可能有点头疼,因为太多的函数,学完都不知道学的是啥😅,正常。所以博主介绍一个学习c++的网站,这个网站也是c++创始人所写的🤔,方便大家学习c++,太良心啦🥰。
官网:cplusplus.com - The C++ Resources Network
⭐主体
基于C语言的字符串,用起来是在复杂,稍不留神可能还会越界访问。为了操作方便,c++产生了string库,便于操作字符串。咱们就按照c++给的官网学习string库,具体分为六大板块,分别为:Member functions(成员函数),Iterators(迭代器),Capacity(容量),Element access(元素访问),Modifiers(修改器),String operations (字符串操作)☺️☺️☺️。
🌙Member functions(成员函数)
在这个板块中挺重要的,咱也不是全学,到时候可能真的就是从入门到放弃。
💫constructor(构造函数)
构造字符串对象,根据使用的构造函数版本初始化其值。
也就是说根据创建的string类来进行赋初始化。
- str:另一个字符串对象,其值被复制或获取。
- pos:str中作为子字符串复制到对象的第一个字符的位置。如果这大于str的长度,则抛出out_of_range。注意:str中的第一个字符由值0(而不是1)表示。
- len:要复制的子字符串的长度(如果字符串较短,则复制尽可能多的字符)。字符串::npos的值表示str结束之前的所有字符。s
那咱们看看这个代码:
#include <iostream> #include <string> using namespace std; int main() { // 无参构造函数 string s1(); // 常量字符串构造函数 string s2("hello world"); cout << s2 << endl; // 拷贝构造函数 string s3(s2); cout << s3 << endl; // 拷贝构造还可以写成下面这样子 string s4 = s2; //初始化不够 11 > 9 string s5("hello world", 9); cout << s5 << endl; return 0; }
运行结果:
💫operator=(赋值函数)
为字符串指定一个新值,替换其当前内容。
这里提供了三种赋值函数:
- 通过string对象赋值给string对象
- 通过常量字符串赋值给string对象
- 通过字符赋值给string对象。
#include <iostream> #include <string> using namespace std; int main() { //通过string对象赋值给string对象 string s1("hello"); string s2; s2 = s1; cout << s2 << endl; //通过常量字符串赋值给string对象 s2 = "world"; cout << s2 << endl; //通过字符赋值给string对象。 s2 = 'C'; cout << s2 << endl; return 0; }
运行结果:
🌙Iterators(迭代器)
我们在前面浅谈了迭代器,没有细说,今天有机会了😋,看着迭代器名字刁刁的,本质上还是一种遍历,像我们的for循环,典型的迭代器,咱们先看看最初我们用下标来访问遍历。
string类是提供了[]运算符重载的,这也就意味着string可以让我们像访问数组一样利用下标来访问元素。
#include <iostream> #include <string> using namespace std; int main() { string s("hello world"); for (size_t i = 0; i < s.size(); i++) { cout << s[i] << " "; } cout << endl; return 0; }
运行结果:
💫利用begin和end实现迭代器
- begin()函数返回的是string字符串的首位置
- end()函数返回的是string字符串最后一个位置(即最后一个字符的下一个位置)
咱看看代码:
#include <iostream> #include <string> using namespace std; int main() { string str("hello world"); string::iterator it = str.begin(); while (it != str.end()) { cout << *it; ++it; } cout << endl; return 0; }
运行结果:
💫范围for实现迭代器
不知道小伙伴还记得auto关键字不,auto可以推导出元素属性(int,char)
咱们看看代码:
#include <iostream> #include <string> using namespace std; int main() { string s("hello world"); for (auto ch : s) { cout << ch; } cout << endl; return 0; }
运行结果:
💫反向迭代器
这里需要介绍一下rbegin()和rend()这两个函数,这两个函数是用来配合反向迭代器使用的。
- rbegin()函数返回的是string字符串的最后一个有效字符
- rend()函数返回的是string字符串的第一个字符的前一个位置。
咱们看看代码:
#include <iostream> #include <string> using namespace std; int main() { string s("hello world"); string::reverse_iterator rit = s.rbegin(); while (rit != s.rend()) { cout << *rit; rit++; } cout << endl; return 0; }
运行结果:
💫const修饰的迭代器
const修饰的迭代器是不可以改变的(只能读不能写)
咱们看看代码:
void Func(const string& s) { string::const_iterator cit = s.begin(); // 读操作 while (cit != s.end()) { cout << *cit; cit++; } cout << endl; // 不能进行写操作,会报错 // cit = s.begin(); // while (cit != s.end()) // { // (*cit) += 1; // cout << *cit; // cit++; // } }
🌙Capacity(容量)
学习这个板块还是比较简单的,也运用比较广泛的一个板块。
💫size和length
size函数和length函数本质上是一样的,都是计算元素总个数的。
咱们看看代码:
#include <iostream> #include <string> using namespace std; int main () { string s("hello world"); cout << s.size() << endl; cout << s.capacity() << endl; return 0; }
运行结果:
- size是计算字符串的元素个数,除\0
- capacity是计算字符串的容量,也就是说定义一个string类是有初始容量的
💫reserve和resize
reserve函数是扩容函数,可以增大capacity的值,
resize其实也是扩容函数,但resize改变的是size的值,当size的值增大时自动触发string的扩容机制从而也增大了capacity的值
resize在增带size值的时候还会对没有字符的位置初始化,如果没有指定初始化内容就默认初始化为’\0’,而reserve不会进行初始化。
咱们看看代码:
#include <iostream> #include <string> using namespace std; int main() { string s("hello"); cout << s << endl; cout << "size:" << s.size() << endl; cout << "capacity:" << s.capacity() << endl; cout << endl; s.reserve(25); cout << s << endl; cout << "size:" << s.size() << endl; cout << "capacity:" << s.capacity() << endl; cout << endl; s.resize(50, 'A'); cout << s << endl; cout << "size:" << s.size() << endl; cout << "capacity:" << s.capacity() << endl; cout << endl; return 0; }
运行结果:
💫max_size
max_size函数是计算字符串可以达到的最大长度。
咱们看看代码:
#include <iostream> #include <string> using namespace std; int main() { std::string str("Test string"); std::cout << "size: " << str.size() << "\n"; std::cout << "length: " << str.length() << "\n"; std::cout << "capacity: " << str.capacity() << "\n"; std::cout << "max_size: " << str.max_size() << "\n"; return 0; }
运行结果:
String类(下):https://developer.aliyun.com/article/1389439