目錄
1,rbegin 和 rend
2,reserve &?capacity
3,max_size ( )
4,size()& resize
1,void resize (size_t,char c)
5,push_back &?append
1,追加字符串范圍
2,直接追加
1,rbegin 和 rend
具體詳情:cplusplus.com/reference/string/string/rbegin/
#include<iostream>
#include<string>
using namespace std;int main()
{string s1("hello world");string::reverse_iterator it = s1.rbegin();while (it != s1.rend()){cout << *it << " ";it++;}return 0;
}
其實也就是逆置打印字符串;
而且缺點也很明顯,類型太長了不便于書寫;
所以 auto 的好用之處就體現出來了,自動幫我們推算類型;
int main()
{string s1("hello world");//string::reverse_iterator it = s1.rbegin();auto it = s1.rbegin();while (it != s1.rend()){cout << *it << " ";it++;}return 0;
}
這樣就更 OK 了;
還有一個冷門不常用的,就是 crengin 代替 rengin ,crend 代替 crend ;
int main()
{string s1("hello world");//string::reverse_iterator it = s1.crbegin();auto it = s1.crbegin();while (it != s1.crend()){cout << *it << " ";it++;}return 0;
}
2,reserve &?capacity
reserve:更改容量,需要多少空間,提前開好即可
capacity:返回空間總大小
int main()
{string s1;string s2("hello world");//初始容量大小cout << s1.capacity() << endl;cout << s2.capacity() << endl;cout << endl;s1.reserve(20);s2.reserve(30);//當 n>容量大小cout << s1.capacity() << endl;cout << s2.capacity() << endl;cout << endl;s1.reserve(5);s2.reserve(5);//當 n<容量大小cout << s1.capacity() << endl;cout << s2.capacity() << endl;return 0;
}
小伙伴們會好奇,為什么擴容的容量不跟我們指定的容量相同;
那是因為編譯器有自己的一套擴容機制;
int main()
{string s1;string s2("hello world");int doll = s1.capacity();cout << s1.capacity() << endl;int i = 1000;while (i--){s1 += ' ';if (doll != s1.capacity()){cout << s1.capacity() << endl;doll = s1.capacity();}}return 0;
}
基本上是按 1.5 倍擴增的,除了剛開始的;
所以空間容量只會在這些值里面,就算是 16?也直接擴容至下一階段 31,其實是 32,因為還有一個 ' \0 ' ;
當擴容之后的量大于當前的容量則擴大;
當擴容之后的量小于當前真實容量則不變,否則縮小;
string s2("hello world") 里面的 " hello world " 真實容量就是11;
3,max_size ( )
算出字符串所能開辟的最大空間
int main()
{string s1;string s2("hello world");cout << s1.max_size() << endl;cout << s2.max_size() << endl;return 0;
}
由上可得 string類所能開辟的最大空間都是一樣的;
但是所能開辟的最大空間并不是真的能開辟,我們來看一段代碼;
int main()
{string s1;string s2("hello world");cout << s2.capacity() << endl;cout << s2.max_size() << endl;s2.reserve(s2.max_size());cout << s2.capacity() << endl;return 0;
}
上面開最大空間的容量的時候,運行直接崩潰的,根本開不出來;?
真實的話是開不出來的,這僅供參考,不必當真;
4,size()& resize
size():返回字符串有效長度
resize():將有效字符的個數該成n個,多出的空間用字符 c 填充
我們直接來看一段代碼
int main()
{string s1;string s2("hello world");//打印有效字符長度和容量大小cout << s1.size() << " " << s1.capacity() << endl;cout << s2.size() << " " << s2.capacity() << endl;cout << endl;s1.resize(20);s2.resize(30);//有效字符對容量的影響cout << s1.size() << " " << s1.capacity() << endl;cout << s2.size() << " " << s2.capacity() << endl;cout << endl;s1.resize(5);s2.resize(8);//cout << s1.size() << " " << s1.capacity() << endl;cout << s2.size() << " " << s2.capacity() << endl;cout << endl;s1.reserve(100);s2.reserve(200);//容量對有效字符的影響cout << s1.size() << " " << s1.capacity() << endl;cout << s2.size() << " " << s2.capacity() << endl;return 0;
}
由上可得,有效字符 size 的長度會影響 capacity 容量,但是 capacity 容量的大小不會影響 有效字符 size ;
而且 字符串有效字符長度會隨著 size 的變化而變化即使是縮小,但是容量不會改變,以后可以用于【刪除數據,保留前 n 個】
1,void resize (size_t,char c)
擴增加尾插
int main()
{string s1;string s2("hello world");s1.resize(10, 'y');s2.resize(20,'x');cout << s2 << endl;cout<< s1 << endl;return 0;
}
這個我們以后可以用作給字符串賦值和初始化;
5,push_back &?append
push_back :在字符串后尾插字符c
append:在字符串后追加一個字符串
直接上代碼:
int main()
{string s1;string s2("hello world");s1.push_back('x');s2.push_back('y');cout << s1 << endl;cout << s2 << endl;cout << endl;s2.append("hello world");s2.append("hello wprld");cout << s1 << endl;cout << s2 << endl;return 0;
}
1,追加字符串范圍
string& append(inputiterator first,inputiterator last);
int main()
{string s1("abcdefg");string s2("hello world");s1.append(s2.begin(), s2.end());cout << s1 << endl;cout << endl;string s3("abcdefg");s2.append(++s3.begin(), --s3.end());cout << s2 << endl;return 0;
}
直接范圍也是可以的,還可以 ++,--;
int main()
{string s1;string s2("hello world");s1.append(s2,2,7);s2.append(10, 'x');cout << s1 << endl;cout << s2 << endl;return 0;
}
?指定也是可以的,用法有很多更 string類的用法類似,大家可以去查查文檔的各種用法;
2,直接追加
int main()
{string s1;string s2("hello world");s1 += 'x';s2 += " abcdefg";cout << s1 << endl;cout << s2 << endl;return 0;
}
直接 追加也可以,更簡便;