目录
一.string类的常用接口说明
#include <string> #include <iostream> using namespace std; int main() { string s1; string s2("hello world"); string s3(5, 'a'); string s4 = s3;//拷贝构造 string s5(s4);//拷贝构造 cout << s1 << endl; cout << s2 << endl;//hello world cout << s3 << endl;//aaaaa cout << s4 << endl;//aaaaa cout << s5 << endl;//aaaaa return 0; }
二.不太常用接口(了解接口)
给无符号整型(size_t)值-1就相当于是让npos为整型最大值。
从第一位开始读取,往后读5位。
默认第0位读起,读5位
确实不太常用。。。
三.string类的遍历访问
string s8("abcdef"); for (size_t i = 0; i < s8.size(); i++) { cout << s8[i] << " "; cout << s8.operator[](i) << " "; } s8[0] = 'x'; cout << s8 << endl;//xbcdef
想不到吧,string类也可以用类似数组的【】.可读可写~
不过这都归功于运算符重载
可不要小看这两个版本,下面那个被const成员函数所修饰只读不写~
3.1 迭代器iterator
不过说到遍历真正的主流还是得看迭代器——iterator
string s1("abcdef"); string::iterator it = s1.begin(); while (it != s1.end()) { *it += 1; cout << *it << " "; ++it; } //b c d e f g
现阶段我们通常认为迭代器iterator像指针~
注意:下标+【】只适用于部分容器,底层物理要有一定的连续。 链式结构、树形、哈希结构等等只能用迭代器。
注意:下面的const_iterator可不要当作const iterator it,前者(const_iterator it)本质是保护迭代器的数据,使*it不能改变。而后者(const iterator it)本质是保护迭代器本身 it不能改变。
后面没啥用,本来遍历访问就得靠it本身遍历,加了个const直接废了。
3.2 反向迭代器
void func(const string & s) { string::const_reverse_iterator it = s.rbegin(); //auto it = s.rbegin(); while (it != s.rend()) { // *it = 'x'; cout << *it << " "; ++it; } cout << endl; } int main() { string s1("hello world"); func(s1);//d l r o w o l l e h return 0; }
因为在func函数中的形参被const所修饰,这意味着*it无法被修改。最后达成逆置的效果~
如果觉得string::const_reverse_iterator这一段太长我们也可以用auto来代替。
四.string的其他功能
4.1 reserve(扩容)
int main() { string s1("hello world"); cout << s1.size() << endl;//11 cout << s1.capacity() << endl;//15 s1.reserve(50); cout << s1.size() << endl;//11 cout << s1.capacity() << endl;//63 s1.reserve(10); cout << s1.size() << endl;//11 cout << s1.capacity() << endl;//63 return 0; }
在vs编译器中reserve的扩容是按1.5倍率慢慢扩容的,而就算我们用reserve提前扩容最后也只会比预估的还大。
(提升:开似开辟了15个空间其实是16个,还有一个预留给‘/0’)
并且在vs编译器中reserve并不能缩容,也无法改变数据。所以基本用于在提前知道所需空间提前扩容节省空间~
4.2 resize
resize不仅可以扩容还会影响到数据的变化~
int main() { string s1("hello world"); cout << s1.size() << endl;//11 cout << s1.capacity() << endl;//15 s1.resize(13);//hello world cout << s1.size() << endl;//13 cout << s1.capacity() << endl;//15 s1.resize(14,'x'); cout << s1 << endl;//hello worldx s1.resize(1); cout << s1.size() << endl;//1 cout << s1.capacity() << endl;//15 cout << s1 << endl;//h return 0; }
没有追加字符时会默认在数据后加‘/0’。
当我们尝试缩容的时候发现在vs编译器下还是无法成功,但数据反而被缩小到相应个数了。
resize的作用也就相当于可以开辟空间的时候随便初始化。
4.3 at
int main() { string s1("hello world"); cout << s1[50] << endl;//直接报错 cout << s1.at(50) << endl;//抛异常 return 0; }
at其实和【】用法基本一样,唯一不同的是它们对越界访问的处理不一样,【】直接报错,而at是抛异常
4.4 append
可以理解为尾插~
int main() { string s1("hello world"); string s2("aaaaaaa"); s1.append("bbbb"); cout << s1 << endl;//hello worldbbbb s1.append(3,'c'); cout << s1 << endl;//hello worldbbbbccc s2.append(s1.begin(), s1.end()); cout << s2 << endl;//aaaaaaahello worldbbbbccc return 0; }
这是一些基本用法,但我们一般不用append,还有一个更简单的~
4.5 +=
int main() { string s1("hello world"); string s2("aaaaaaa"); s1 += 'a'; cout << s1 << endl;//hello worlda s1 += s2; cout << s1 << endl;//hello worldaaaaaaaa s1 += "ddd"; cout << s1 << endl;//hello worldaaaaaaaaddd return 0; }
+=的用法比append还简单~
4.6 insert
标签:const,string,iterator,s1,C++,迭代,cout From: https://blog.csdn.net/fax_player/article/details/140623446常见用法:
int main() { string s1("hello world"); string s2("aaaaaaa"); s1.insert(0, 1, 'b');//在0位置插入1个字符‘a' cout << s1 << endl; s1.insert(2, "aaaaa");// bhaaaaaello world cout << s1 << endl; return 0; }