深圳網(wǎng)站建設(shè)php廈門(mén)seo全網(wǎng)營(yíng)銷(xiāo)
String的頭文件是#include? <string>
String本質(zhì)上是一個(gè)類(lèi),是C++實(shí)現(xiàn)好的一個(gè)類(lèi)
初學(xué)只用學(xué)重要的部分,不可能一次性全部學(xué)完
1.構(gòu)造函數(shù)
我們先來(lái)看它的幾個(gè)構(gòu)造函數(shù)
首先(1)就是無(wú)參的構(gòu)造
(2)是對(duì)str的字符串進(jìn)行拷貝(拷貝構(gòu)造)
(4)常量字符串初始化
(6)拷貝n個(gè)字符c進(jìn)行初始化
上面幾個(gè)是最常用的
下面幾個(gè)可以了解一下
(5)就是拷貝s字符串的前n個(gè)字符進(jìn)行初始化
(3)從字符串str的pos位置開(kāi)始的len長(zhǎng)度的部分拷貝
這個(gè)地方len還有一個(gè)缺省值npos,代表size_t的最大值,可以理解成,如果你不給參數(shù),它會(huì)讀到字符串讀完
?2.其他函數(shù)
operator <<和operator>>
string可以直接進(jìn)行流插入和流提取,因?yàn)檫@個(gè)地方對(duì)流插入操作符和流提取操作符進(jìn)行重載了!
compare()
同樣的string也可以直接比較大小,比較方式和C語(yǔ)言的strcmp,但是效率比strcmp高,原因是string類(lèi)里有compare的字符串大小比較的函數(shù)
operator=
同樣的,我們對(duì)于賦值操作符,string也替我們封裝好了
下面是幾種常用的賦值
int main(void) {string s1;string s2;s1 = "abc";//(2)s2 ='a';//(3)s1 = s2;//(1)return 0;
}
push_back
?那么我們?nèi)绻谧址竺娌迦朐趺崔k?
string也給我們提供能直接使用的函數(shù)
插入一個(gè)字符
append()
那如果插入字符串呢?
?
int main(void) {string s1;string s2;string s3;s3 = "asas";s1 = "abc";s2 ='a';s1.push_back('a');s1.append(s3);return 0;
}
operator+=
當(dāng)然這兩個(gè)函數(shù)比C語(yǔ)言的函數(shù)好的地方在于它會(huì)自動(dòng)擴(kuò)容,但是如果你覺(jué)得這兩個(gè)函數(shù)還是復(fù)雜了,有一個(gè)更簡(jiǎn)單的方法,直接+=就可以了
int main(void) {string s1;string s2;string s3;s3 = "asas";s1 = "abc";s2 ='a';s1 += s2;s1 += s3;return 0;
}
?這個(gè)地方+=本質(zhì)上和上面兩個(gè)函數(shù)是相同的,只不過(guò)我們根據(jù)+=類(lèi)型不同,我們operator+=去調(diào)用不同的函數(shù),比如push_back和append
operator []
那么如果我們要遍歷字符串怎么辦呢?我們可以用operator []
?[]符號(hào)本質(zhì)上是對(duì)數(shù)組進(jìn)行簡(jiǎn)引用,當(dāng)然這個(gè)函數(shù)操作對(duì)象的值是可修改的
如果要遍歷字符串,那我們?cè)趺粗肋@個(gè)字符串多長(zhǎng)呢?
size()
這個(gè)時(shí)候我們就可以用size函數(shù)了,這個(gè)size函數(shù)的大小是不算字符串最后的\0的和strlen一樣
當(dāng)然length也是一樣的,但是size用的更多,推薦使用size
因此我們就可以去遍歷打印字符串了
int main(void) {string s1;s1 = "asas";for (int i = 0;i < s1.size();i++){cout << s1[i] << endl;}return 0;
}
?數(shù)組的[]和string的[]底層是不一樣的!
int main(void) {string s1;s1 = "asas";char a[3] = {"ab"};a[1];//本質(zhì)上是*(a+1)s1[1];//本質(zhì)上是s1.operator[](1)return 0;
}
capacity()
capacity表示的是容量,我們?nèi)萘坎蛔愕臅r(shí)候就會(huì)自動(dòng)擴(kuò)容,不同編譯器下擴(kuò)容倍數(shù)不同
max_size()
max_size返回字符串能達(dá)到的最大值,但是這個(gè)值在不同編譯器結(jié)果不一樣,實(shí)際毫無(wú)意義
clear()
clear表示清理數(shù)據(jù),clear會(huì)改變size的大小,但是不會(huì)改變capacity的大小!有析構(gòu)函數(shù)做最后的保底
empty()
empty判斷是否為空
?
3.迭代器
string::iterator it = s1.begin();while (it != s1.end()){cout << *it <<" ";++it;
}
1.普通順序迭代器 interator
迭代器包含it begin end
it是當(dāng)前指向的位置(初始位置為begin)
begin是指向第一個(gè)元素
end是指向最后一個(gè)元素
但是begin 和end 以及it都是左閉右開(kāi)
迭代器是像指針一樣的類(lèi)型,可能是指針,可能不是指針!
string平時(shí)迭代器用的不多
那么迭代器有哪些優(yōu)勢(shì)呢?
2.迭代器的優(yōu)點(diǎn)
1.范圍for的底層是迭代器
不支持迭代器的就不支持范圍for
比如說(shuō)棧,因?yàn)橐笙冗M(jìn)先出,所以不支持迭代器,也不支持范圍for
2.任何容器都支持迭代器,且用法相似,迭代器會(huì)和容器配合
3.反向迭代器? reverse_iterator
rebegin指向最后一個(gè)元素
rend指向第一個(gè)元素
rit指向當(dāng)前位置,(初始位置為最后一個(gè)元素)
string::reverse_iterator it = s1.rbegin();while (it != s1.rend()){cout << *it << " ";++it;}
當(dāng)然這個(gè)地方用auto也很爽()包括上面的正序也可以
auto it = s1.rbegin();while (it != s1.rend()){cout << *it << " ";++it;}
4.const順序迭代器和const逆序迭代器
對(duì)于const對(duì)象,我們不能用普通迭代器,就要用const迭代器
同樣逆置也有它的const迭代器
void aaa(const string& s1)
{string::const_iterator it = s1.begin();//或者auto it=s1.begin();while (it != s1.end()){cout << *it << " ";++it;}auto ot=s1.rbegin();//或者string::const_reverse_iterator ot = s1.rbegin();while (ot!=s1.rend()){cout << *ot << " ";++ot;}
}
int main(void) {string s1 = "asas";aaa(s1);return 0;
}