做網(wǎng)站推廣的好處seo外包靠譜
目錄
1.什么是STL
2.STL的版本
3.STL的六大組件
?4.string類
4.1為什么學(xué)習(xí)string類?
4.2string常見接口
4.2.1默認(rèn)構(gòu)造
?編輯
4.2.2析構(gòu)函數(shù)
?Element access:
4.2.3 []
4.2.4迭代器
?編輯
?auto
?4.2.4.1?begin和end
?4.2.4.2.regin和rend
Capacity:
?4.2.5.3?size
4.2.6 lenth?
4.2.7 cleart
Modifiers:
4.2.7 apend
4.2.8? +=
4.2.9 erase
4.2.10 replace
?String operations:
?4.2.11 find
4.2.12 substr
4.2.13? find_first_of
4.2.14? find_ last_of
4.2.15 find_first_not_of
?4.2.16 find_last_not_of
1.什么是STL
STL(standarf template libaray-標(biāo)準(zhǔn)模板庫):是C++標(biāo)準(zhǔn)庫的重要組成部分,不僅是一個(gè)可復(fù)用的組件庫,而且是一個(gè)包羅數(shù)據(jù)結(jié)構(gòu)與算法的軟件框架。
2.STL的版本
- 原始版本
Alexander Stepanov MengLee 在惠普實(shí)驗(yàn)室完成的原始版本,本著開源精神,他們聲明允許任何人任意運(yùn)用,拷貝,修改,傳播,商業(yè)使用這些代碼,無需付費(fèi)。唯一的條件就是也需要向原始版本一樣做開源使用。HP版本--所有STL實(shí)現(xiàn)版本的始祖。
- P.J.版本
由P.J.Plauger開發(fā),繼承自HP版本,被Windows Visual C++采用,不能公開或修改,缺陷:可讀性比較低,符號(hào)命名比較怪異。
- RW版本
由Rouge Wage 公司開發(fā),繼承自HP版本,被C++ Builder 采用 ,不能公開或修改,缺陷:可讀性一般
- SGL版本
由Silicon Graphics Computer Systems ,Inc公司開發(fā),繼承自HP版本。被GCC(Linux)采用,可移植性較好,可公開,修改甚至販賣,從命名風(fēng)格和編程風(fēng)格上看,閱讀性非常高。
3.STL的六大組件
?4.string類
4.1為什么學(xué)習(xí)string類?
C語言中,字符串是以"\0"結(jié)尾的一些字符的集合,為了方便操作,C標(biāo)準(zhǔn)庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)與字符串是分開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會(huì)越界訪問。而且在常規(guī)工作中,為了簡單,方便,快捷,基本都使用string類,很少有人使用C庫中的字符串操作函數(shù)
4.2string常見接口
4.2.1默認(rèn)構(gòu)造
實(shí)例
//無參構(gòu)造//string();string s1;//帶參構(gòu)造string s2("111");//string(const char* s); //拷貝構(gòu)造string s3(s2);//string(const string & str);string s4("123", 2, 1);//string(const string & str, size_t pos, size_t len = npos);//復(fù)制str中從字符下標(biāo)位置 pos 開始的len個(gè) 字符進(jìn)行拷貝構(gòu)造(如果任一 str 太短或 len 為 string::npos,則復(fù)制到str 的末尾)。string s5("123",0 ,string:: npos);// string(const char* s, size_t n);string s6("123", 2);//從 s 指向的字符數(shù)組中復(fù)制前 n 個(gè)字符。//string(size_t n, char c);//用連續(xù)的n個(gè)c字符去初始化string s7(3, 'c');//template <class InputIterator>//string(InputIterator first, InputIterator last);
4.2.2析構(gòu)函數(shù)
?Element access:
4.2.3 []
獲取字符串的字符
?利用[]來進(jìn)行讀寫,下標(biāo)+[]遍歷
int main()
{ string s1("abcd");//寫s1[0] ='*';//將下標(biāo)為0的元素修改為1cout << s1 << endl;//讀for (int i = 0; i < s1.size(); i++){cout << s1[i] ;}return 0;
}
?
[]原型
class string
{public:
char& operator[](size_t i){return _str[i];}
private:char* _str;size_t _size;size_t _capacity;
};
4.2.4迭代器
在 STL 中,迭代器(Iterator)用來訪問和檢查 STL 容器中元素的對(duì)象,它的行為模式和指針類似,但是它封裝了一些有效性檢查,并且提供了統(tǒng)一的訪問格式。他的底層是指針
迭代器遍歷
int main()
{ string s1("abcd");string::iterator it = s1.begin();while (it != s1.end()){cout << *it <<" " ;++it;}return 0;
}
?auto
補(bǔ)充一個(gè)C++小語法
auto可自動(dòng)推導(dǎo)類型,極大程度簡化代碼
const string s3("hello ward!");//string::const_iterator cit=s3.begin(); 可簡寫成:
auto cit = s3.begin();
?auto聲明方式
auto? 變量名 ;
auto? 函數(shù)名 (形參列表)
{
//函數(shù)體
}
?auto的實(shí)例
int fun()
{return 10;
}
int main()
{int a=10;auto b = a;auto c = 'a';auto d = fun();auto& e = a;auto* f = &a;cout << typeid(a).name() << endl;cout << typeid(b).name()<< endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;cout << typeid(e).name() << endl;cout << typeid(f).name() << endl;return 0;
}
- 在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動(dòng)存儲(chǔ)的局部變量,后來這個(gè)不重要了,C++11中,標(biāo)準(zhǔn)委員會(huì)被廢為寶賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類型指示符,而是作為一個(gè)新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得
- 用auto聲明指針類型時(shí),用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時(shí)必須加&
- 當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是相同的類型,否則編譯器會(huì)報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對(duì)第一個(gè)類型進(jìn)行推導(dǎo),然后用推導(dǎo)出來的類型定義其他變量
- auto不能作為函數(shù)的參數(shù),可以做返回值,但是謹(jǐn)慎使用
- aoto不能直接用來聲明數(shù)組
范圍for遍歷
?aoto自動(dòng)推導(dǎo),字符賦值,自動(dòng)迭代,自動(dòng)判斷結(jié)束,底層上也是迭代器,所有的容器都支持范圍for,因?yàn)樗械娜萜鞫贾С值?/p>
?4.2.4.1?begin和end
?1.begin
?返回第一個(gè)字符的正向迭代器
int main()
{ string s1("abcd");cout<<* s1.begin();return 0;
}
?
2. end 返回最后一個(gè)字符的正向迭代器
?可配合起來正向遍歷
int main()
{string s1("abcdef");string::const_iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";it++;}return 0;
}
?
?4.2.4.2.regin和rend
regin?返回最后一個(gè)的反向迭代器
?rend 返回第一個(gè)字符的反向迭代器
配合起來可支持反向遍歷
int main()
{string s1("abcdef");string::const_reverse_iterator it = s1.rbegin();while (it != s1.rend()){cout << *it << " ";it++;}return 0;
}
?
Capacity:
?4.2.5.3?size
?返回字符串的長度,不包括'\0'
int main()
{ string s1("abcd");cout << s1.size();return 0;
}
4.2.6 lenth?
??返回以字節(jié)為單位的長度,不包括"\0"
int main()
{string s1("abcdef");cout << s1.length()<<endl;return 0;
}
?
4.2.7capacity
l返回容量大小
?
?4.2.7reserve
保留預(yù)留,提前開空間,避免擴(kuò)容,提高效率
int main()
{string s1("abcdef");cout << s1.capacity() << endl;s1.reserve(100);cout << s1.capacity()<<endl;//可以擴(kuò)容,>=100s1.reserve(50);cout << s1.capacity() << endl;//一般不會(huì)縮容return 0;
}
4.2.7 cleart
清除數(shù)據(jù),一般不清除容量
int main()
{string s1("abcdef");cout << s1.capacity() << endl;cout << s1.size() << endl;s1.clear();cout << s1.capacity() << endl;cout << s1.size() << endl;//一般不會(huì)縮容return 0;
}
?
Modifiers:
4.2.7 apend
字符串追加
int main()
{string s1("abcdef");//string& append(const string & str);s1.append("yyy");cout << s1 << endl;// string& append(const string & str, size_t subpos, size_t sublen);
//追加 str 子字符串的副本。子字符串是 str 中從字符位置 subpos 開始并跨越 sublen 字符的部分(或者直到 str 的末尾,如果任一 str 太短或 sublen 是 string::npos)。s1.append("aaaa", 2, 1);cout << s1 << endl;return 0;
}
?
4.2.8? +=
字符串拼接,尾插
int main()
{string s1("abcdef");string s2("123");//string& operator+= (const string & str);s1 += s2;s1 += 'a';
//string& operator+= (char c);s1 += "aaa";
//string & operator+= (const char* s);return 0;
}
int main()
{string s1("abcdef");string s2("123");//string& insert(size_t pos, const string & str);// 在pos之前插入strs1.insert(0, "abc");//string& insert(size_t pos, const string & str, size_t subpos, size_t sublen);//在下標(biāo)pos位置之前插入str下表中subpos到下標(biāo)sublen位置的元素s2.insert(0, "abcdd", 0, 4);cout << s2 << endl;//string & insert(size_t pos, const char* s);//在pos位置之前插入s//string& insert(size_t pos, const char* s, size_t n);//從在下標(biāo)為pos的位置插入s的n個(gè)字符//string& insert(size_t pos, size_t n, char c);//在pos位置之前插入n個(gè)c字符//void insert(iterator p, size_t n, char c);//在迭代器的位置之前插入n個(gè)字符c//iterator insert(iterator p, char c);//在迭代器的位置之前插入字符cs1.insert(s1.begin(), '*');cout << s1 << endl;return 0;
}
4.2.9 erase
頭刪
int main()
{string s1("abcdef");string s2("123");//string& erase(size_t pos = 0, size_t len = npos);//擦除字符串值中從字符位置 pos 開始并到 len 字符的部分不包括len(如果內(nèi)容太短或 len 為 string::npos,則擦除字符串值的末尾。s1.erase(0, 2);//iterator erase(iterator p);//擦除 p 指向的字符。s1.erase(s1.begin());//iterator erase(iterator first, iterator last);
//擦除[first,last] 范圍內(nèi)的字符序列s1.erase(s1.begin(), s2.end());cout << s1 << endl;return 0;
}
4.2.10 replace
替換
int main()
{string s1("abcdef");string s2("123");//string & replace(size_t pos, size_t len, const char* s);//string& replace(size_t pos, size_t len, const string & str);//把pos位置到len位置替換成str//string& replace(iterator i1, iterator i2, const char* s);//string& replace(iterator i1, iterator i2, const string & str);//把i1到i2之間的迭代器換成str//string& replace(size_t pos, size_t len, size_t n, char c);//string& replace(size_t pos, size_t len, const char* s, size_t n);//把pos位置到len位置替換成str中的前n個(gè)//string& replace(iterator i1, iterator i2, const char* s, size_t n);//把i1到i2之間的迭代器換成str中的前n個(gè)//string& replace(iterator i1, iterator i2, size_t n, char c);//把i1到i2之間的迭代器換成n個(gè)字符c//string& replace(iterator i1, iterator i2,//InputIterator first, InputIterator last);//將迭代器輸入到范圍內(nèi)的初始位置和最終位置。使用的范圍是 [first,last),它包括 first 和 last 之間的所有字符,包括 first 指向的字符,但不包括 last 指向的字符return 0;
}
?String operations:
?4.2.11 find
查找
返回第一個(gè)匹配的第一個(gè)字符的位置。
如果未找到匹配項(xiàng),該函數(shù)將返回?string::npos。(整型最大值)
int main()
{string s1("abcdef");string s2("123");//size_t find(const string & str, size_t pos = 0) const;s1.find("bce");// size_t find(const char* s, size_t pos = 0) const;//在pos位置找ss1.find('a');// size_t find(const char* s, size_t pos, size_t n) const;//從pos位置找s的前n個(gè)cout<< s1.find("aaa", 1, 2);// size_t find(char c, size_t pos = 0) const;//從pos位置開始搜索字符creturn 0;
}
4.2.12 substr
獲得對(duì)于位置以后的子串然后重新構(gòu)成string類返回
int main()
{string s1("abcdef");//tring substr(size_t pos = 0, size_t len = npos) const;//從pos位置開始的len個(gè)字符重新構(gòu)建成string再返回s1.substr(3, 4);return 0;
}
實(shí)例
int main()
{string s("text.cpp");size_t pos = s.rfind('.');string suffix = s.substr(pos);cout << suffix << endl;;return 0;
}
?
4.2.13? find_first_of
順著找字符串中的字符,找到返回第一個(gè)出現(xiàn)的下標(biāo)
int main()
{string s1("abcdef");//ze_t find_first_of(const string & str, size_t pos = 0) const;//ize_t find_first_of(const char* s, size_t pos = 0) const;//ize_t find_first_of(char c, size_t pos = 0) const;//在pos位置開始找str中的字符s1.find_first_of("abc");//ize_t find_first_of(const char* s, size_t pos, size_t n) const;//在pos位置找s的前n個(gè)return 0;
}
4.2.14? find_ last_of
倒著找字符串中的字符,找到返回第一個(gè)出現(xiàn)的下標(biāo)
int main()
{string s1("abcdef");//size_t find_last_of(const string & str, size_t pos = npos) const;// //size_t find_last_of(char c, size_t pos = npos) const;// size_t find_last_of(const char* s, size_t pos = npos) const;//從最后一個(gè)位置向前找str中的字符s1.find_last_of("Abc",2,4);//size_t find_last_of(const char* s, size_t pos, size_t n) const;//從最后一個(gè)位置向前找str中的n個(gè)字符return 0;
}
?分割文件
void SplitFilename(const std::string & str){std::cout << "Splitting:" << str << endl;std::size_t found = str.find_last_of(" / \\");std::cout << "path:" << str.substr(0, found) << endl;std::cout << "file:" << str.substr(found + 1) << endl;}
int main()
{string str1("windows\\winhelp.exe");string str2("/url/bin/man");SplitFilename(str1);cout << endl;SplitFilename(str2);return 0;
}
4.2.15 find_first_not_of
沒找到就返回,順著找返回第一個(gè)不匹配的對(duì)應(yīng)下標(biāo)
int main()
{string s1("abcdef");//size_t find_first_not_of(const string & str, size_t pos = 0) const;//size_t find_first_not_of(const char* s, size_t pos = 0) const; // //size_t find_first_not_of(char c, size_t pos = 0) const;//從第一個(gè)位置向前找str中的n個(gè)字符找到第一個(gè)不匹配的元素下標(biāo),找不到就返回// //size_t find_first_not_of(const char* s, size_t pos, size_t n) const;//從第一個(gè)位置向后找中第一個(gè)不匹配的字符str中的前n個(gè)的字符return 0;
}
實(shí)例
int main()
{//string str("Please, replace the vowels in this sentence by asterisks.");//除了"abcdef"以外全部替換成*std::size_t found = str.find_first_not_of("abcdef");while (found != std::string::npos){str[found] = '*' ;found = str.find_first_not_of("abcdef", found + 1);}std::cout << str;return 0;
}
?
?4.2.16 find_last_not_of
倒著找,找到第一個(gè)不匹配返回下標(biāo)
int main()
{//ize_t find_first_not_of(const string & str, size_t pos = 0) const;// size_t find_first_not_of(const char* s, size_t pos = 0) const;//size_t find_first_not_of(char c, size_t pos = 0) const;// 從最后一個(gè)位置向前找第一個(gè)不匹配str中的字符的下標(biāo)//size_t find_first_not_of(const char* s, size_t pos, size_t n) const;//從最后一個(gè)位置向前找第一個(gè)不匹配str中的前n個(gè)字符的下標(biāo),找不到就返回return 0;
}