主要介紹兩種最重要的標(biāo)準(zhǔn)庫(kù)類(lèi)型:string和vector。
string表示可變長(zhǎng)的字符序列。
vector存放的是某種給定類(lèi)型對(duì)象的可變長(zhǎng)序列。
1 標(biāo)準(zhǔn)庫(kù)類(lèi)型string
#include <string>
using std::string;
1.1 定義和初始化string類(lèi)型
string s1;
string s1(s2);
string s2 = s1; //拷貝初始化
string s3 = "hiya"; //直接初始化
string s4(10,'c');
string s8 = string(10,'c');
1.2 string對(duì)象上的操作
os<<s; is>>s; getline(is,s); s.empty(); s.size();
s[n]; s1+s2; s1=s2; s1==s2; s1!=s2; <, <=, >, >=;
string s1, s2;
cin >> s1 >> s2;
cout << s1 << s2 << endl;
string word; while(cin >> word) cout << word << endl;
int main() {string line; while(getline(cin, line)) cout << line << endl; return 0;}
string的empty()和size操作
if(!line.empty()) 表示如果字符串line是空的
line.size()返回值的數(shù)據(jù)類(lèi)型是string::size_type類(lèi)型,所以需要在使用前面加auto
auto len = line.size();
字面值和string對(duì)象相加
string s4 = s1 + ", ";//正確:把一個(gè)string對(duì)象和一個(gè)字面值相加
string s5 = "hello" + ", ";//錯(cuò)誤:兩個(gè)運(yùn)算對(duì)象都不是string
string s6 = s1 + ", " + "world";//正確:每個(gè)加法運(yùn)算符都有一個(gè)運(yùn)算對(duì)象是string
string s7 = "hello" + ", " + s2;//錯(cuò)誤:不能把字面值直接相加
處理每個(gè)字符?使用基于范圍的for語(yǔ)句
string str("some string");
for(auto c: str) cout << c << endl;
for(auto &c: s) c = toupper(c);
2 標(biāo)準(zhǔn)庫(kù)類(lèi)型vector
#include <vector>
using std::vector;
vector<int> ivec;
vector<vector<int> >
2.1 定義和初始化vector對(duì)象
vector<T> v1 vector<T> v2(v1)
vector<T> v2 = v1 vector<T> v3(n,val)
vector<T> v4(n) vector<T> v5{a,b,c,...}
vector<T> v5 = {a,b,c,...}
2.2 其他vector操作
v2.push_back(i); v.empty(); v.size(); v[n];
vector<int> v{1,2,3,4,5,6,7,8,9};
for(auto &i: v) i *= i;
for(auto i: v) cout << i << " "; cout << endl;
使用下標(biāo)運(yùn)算符能獲取到指定的元素。和string一樣,vector對(duì)象的下標(biāo)也是從0開(kāi)始計(jì)起,下標(biāo)的類(lèi)型是相應(yīng)的size_type類(lèi)型。
3 迭代器介紹
類(lèi)似于指針類(lèi)型,迭代器也提供了對(duì)對(duì)象的間接訪問(wèn)。就迭代器而言,其對(duì)象是容器中的元素或者string對(duì)象中的字符。使用迭代器可以訪問(wèn)某個(gè)元素,迭代器也能從一個(gè)元素移動(dòng)到另一個(gè)元素。迭代器有有效和無(wú)效之分,這一點(diǎn)和指針差不多。有效的迭代器或者指向某個(gè)元素,或者指向容器中尾元素的下一個(gè)位置。
3.1 使用迭代器
auto b = v.begin(), e = v.end();// b表示v的第一個(gè)元素,e表示v為元素的下一個(gè)位置
//標(biāo)準(zhǔn)容器迭代器的運(yùn)算符
*iter //返回迭代器iter所指元素的引用
iter->mem //解引用iter并獲取該元素的名為mem的成員,等價(jià)于(*iter).mem
++iter //令itera指示容器中的下一個(gè)元素
--iter //令iter指示容器中的上一個(gè)元素
iter1 == iter2 //判斷兩個(gè)迭代器是否相等(不相等)
string s("some string");
if(s.begin() != s.end()){auto it = s.begin(); *it = toupper(*it);}
for(auto it = s.begin(); it != s.end()&&!isspace(*it); ++it) *it = toupper(*it);
迭代器類(lèi)型
vector<int>::iterator it; // it 能讀寫(xiě)vector<int>的元素
vector<int>::const_iterator it; // it 只能讀vector<int>的元素
string::iterator it;
string::const_iterator it;
auto it3 = v.cbegin();
只要兩個(gè)迭代器指向的是同一個(gè)容器中的元素或者尾元素的下一個(gè)位置,就能將其相減,所得結(jié)果是兩個(gè)迭代器的距離。所謂距離指的是右側(cè)的迭代器向前移動(dòng)多少位置就能追上左側(cè)的迭代器,其類(lèi)型名為difference_type的帶符號(hào)整數(shù)。
4 數(shù)組
在使用數(shù)組下標(biāo)的時(shí)候,通常將其定義為size_t類(lèi)型。在cstddef頭文件中定義了size_t類(lèi)型。