ic外貿(mào)網(wǎng)站建設(shè)網(wǎng)絡(luò)媒體有哪些
文章目錄
- 1.為什么要學(xué)習(xí)string類
- 2.標(biāo)準(zhǔn)庫(kù)中的string類
- 1.string分類
- 2.string類對(duì)象的常見(jiàn)構(gòu)造
- 1.string
- 3. string類對(duì)象的容量操作
- 1.size
- 2.capacity
- 3.reserve
- 4.resize
- 擴(kuò)容+初始化
- 刪除數(shù)據(jù)
- 4. string類對(duì)象的修改操作
- 1.push_back
- 2.append
- 3.operator+=
1.為什么要學(xué)習(xí)string類
- c語(yǔ)言的字符串是以’\0’結(jié)尾的一些字符的集合,比如存儲(chǔ)你的家庭住址,修改成為新的住址,原來(lái)的住址短,現(xiàn)在的住址長(zhǎng),之前的字符串?dāng)?shù)組存不下,不能很好按需修改
- c++提供一個(gè)類來(lái)管理字符串,這個(gè)類就叫string
2.標(biāo)準(zhǔn)庫(kù)中的string類
1.string分類
-
string 是一個(gè)類模板,原型是一個(gè) basic_string的類模板由typedef成為string
-
char(重點(diǎn)使用)

- char:1個(gè)字節(jié) ,即一個(gè)字符1個(gè)字節(jié)
- 寬字符存在(使用相對(duì)偏少)

- wchar_t :2個(gè)字節(jié) ,即一個(gè)字符2個(gè)字節(jié)
-
C++11提供u16string和u32string(了解)
-
char16_t:2個(gè)字節(jié) 即一個(gè)字符2個(gè)字節(jié)

- char32_t: 4個(gè)字節(jié) 即一個(gè)字符4個(gè)字節(jié)
- 上述多種string形式說(shuō)明有管理不同字符數(shù)組的需求
- ASCII是美國(guó)標(biāo)準(zhǔn)信息交換代碼,用來(lái)在計(jì)算機(jī)里面存儲(chǔ)和顯示英文信息,通過(guò)26個(gè)字母、數(shù)字、標(biāo)點(diǎn)符號(hào),來(lái)建立關(guān)系形成映射表從而生成了編碼表,調(diào)用對(duì)應(yīng)的ASCII值來(lái)生成對(duì)應(yīng)的符號(hào),ASCII表只有128個(gè)字符,一個(gè)字節(jié)8個(gè)bit位就夠了
- 為了支持顯示除了英文以外的文字顯示,就發(fā)明出了unicode (萬(wàn)國(guó)碼),為每種語(yǔ)言的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼
- 使用2個(gè)字節(jié)進(jìn)行統(tǒng)一編碼
- 使用4個(gè)字節(jié)進(jìn)行統(tǒng)一編碼
- UTF-16對(duì)應(yīng)u16string ,UTF-32對(duì)應(yīng) u32string
2.string類對(duì)象的常見(jiàn)構(gòu)造
- 必須包含頭文件< string >
1.string
- string()——構(gòu)造空的string類對(duì)象,即空字符串
- string(const char*s) ——用常量字符串構(gòu)造string字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{string s1;string s2("hello");//遍歷數(shù)組并使每個(gè)字符+1for (size_t i = 0; i < s2.size();i++){s2[i]++;}cout << s2 << endl;// 通過(guò)重載流提取(<<),string可以直接進(jìn)行打印//ifmmpreturn 0;
}
- string(const string&str,size_t pos,size_t len=npos);—— 拷貝str從pos開(kāi)始的len個(gè)字符
如果len長(zhǎng)度大于pos位置后的字符個(gè)數(shù),則有多少取多少
若len沒(méi)有給值,則會(huì)自動(dòng)默認(rèn)缺省值npos
size_t npos=-1,由于是無(wú)符號(hào)整形,實(shí)際上是-1的補(bǔ)碼即整形最大值
#include<iostream>
#include<string>
using namespace std;
int main()
{string s1("hello world");string s2(s1, 6, 5);//拷貝s1從第6個(gè)位置開(kāi)始取5個(gè)字符string s3(s1, 6, 15);//由于pos為指向后取只有5個(gè)字符,小于15,有多少取多少string s4(s1, 6);//len缺省值為整形最大值,則一直從pos位置取到結(jié)尾
cout<<s2<<endl;
cout<<s3<<endl;
cout<<s4<<endl;
}
- string(size_t n,char c); ——填string類對(duì)象前n個(gè)字符
int main()
{string s(10, '.');// 前10個(gè)字符為 .cout << s << endl;//..........return 0;
}
3. string類對(duì)象的容量操作
1.size
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello world");cout << s.size() << endl;//11cout << s.length() << endl;//11return 0;
}
- size和length兩者功能相同,由于string發(fā)展歷史造成的,最開(kāi)始字符串的長(zhǎng)度為length,后來(lái)為了和數(shù)據(jù)結(jié)構(gòu)其他保持一致使用size更符合,所以推薦使用size
2.capacity
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello world");cout << s.size() << endl;//11cout << s.capacity() << endl;//15return 0;
}

- 有11個(gè)字符,但是空間大小為15(不包含/0)
3.reserve
#include<iostream>
#include<string>
using namespace std;
//擴(kuò)容問(wèn)題
int main()
{string s;//s.reserve(100);//提前開(kāi)辟100個(gè)空間size_t sz = s.capacity();//sz代表原來(lái)的容量cout << "making a grow" << endl;for (int i = 0; i < 100; i++){s.push_back('c');//不斷在字符串后插入字符cif (sz != s.capacity())//擴(kuò)容后,將sz值更新{sz = s.capacity();cout << "capacity changed:" << sz << endl;}}
}
- 提前開(kāi)辟空間,減少擴(kuò)容,提高效率
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");s.reserve(100);cout << s.size() << endl;//5cout << s.capacity() << endl;//111return 0;
}
- reserve只會(huì)改變capacity,不會(huì)改變size
- size值沒(méi)有改變依舊為5,capacity被提前開(kāi)辟100個(gè)空間
4.resize
擴(kuò)容+初始化
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");s.resize(100);cout << s.size() << endl;//100cout << s.capacity() << endl;//111return 0;
}
- reserve既改變capacity,也會(huì)改變size
- size值被改變?yōu)?00,被修改的部分填的是缺省值’\0’,
capacity值也被改變?yōu)?11
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");s.resize(10,'x');//將size修改的值填成xreturn 0;
}
- 可以手動(dòng)添加字符填成自己想給的值
刪除數(shù)據(jù)
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");s.resize(2);//2<5,所以只保留前2個(gè)字符 cout << s << endl;//hecout << s.capacity() << endl;//15return 0;
}
- 若resize值小于size值,可以刪除數(shù)據(jù),但不會(huì)改變?nèi)萘?/font>
4. string類對(duì)象的修改操作
1.push_back
- 在字符串后插入字符
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");s.push_back(' ');s.push_back('!');cout << s << endl;//hello !return 0;
}
2.append
- 在字符串后插入字符串
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");s.append(" world!");cout << s << endl;//hello world!return 0;
}
3.operator+=
- 字符串后插入字符/字符串/對(duì)象
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("hello");s += ' ';//字符s+='!';s += "world";//字符串string s2("abc");s += s2;//對(duì)象cout << s << endl;//hello !worldabcreturn 0;
}
相比于push_back 插入字符和append插入字符串,operator+=方式更容易使用