目錄
常用函數一覽
默認成員函數
與容量有關的函數
part 1
part 2
part 3
與訪問和遍歷有關的函數
與修改有關的函數
npos
與string相關的其它常用函數
常用非成員函數
getline和cin的區別
常用函數一覽
//默認成員函數
string();string(const char* s);string(size_t n, char c);string(const string& str);//與容量有關的函數
size_t size() const;size_t capacity() const;void reserve(size_t n);void resize(size_t n, char c);void reserve(size_t n = 0);bool empty() const;void clear();//與訪問及遍歷有關的操作
char& operator[] (size_t pos);const char& operator[] (size_t pos) const;iterator begin();const_iterator begin() const;iterator end();const_iterator end() const;// 與修改有關的操作
string& operator+= (const string& str);string& operator+= (const char* s);string& operator+= (char c);string& append(const char* s);void push_back(char c);string& insert(size_t pos, const char* s);string& insert(size_t pos, size_t n, char c);string& erase(size_t pos = 0, size_t len = npos);//與string相關的其他常用函數
const char* c_str() const;size_t find(char c, size_t pos = 0) const;size_t rfind(char c, size_t pos = npos) const;string substr(size_t pos = 0, size_t len = npos) const;//常用非成員函數
istream& operator>> (istream& is, string& str);ostream& operator<< (ostream& os, const string& str);istream& getline(istream& is, string& str);
默認成員函數
1)string();//構造空的string類對象,即空的字符串
2)string(const char* s);//用C語言形式的字符串來構造string類對象
3)string(size_t n, char c);//用n個字符c來構造string類對象
4)string(const string& str); //用已有對象去構造新的對象
5)string& operator= (const string& str);//賦值重載
#include <iostream>
#include <string>
using namespace std;void test()
{string s1;string s2("hello world!");string s3(10, 'x');cout << "s1:" << s1 << endl;cout << "s2:" << s2 << endl;cout << "s3:" << s3 << endl;string s4(s2);cout << "s4:" << s4 << endl;s1 = s2;cout << "s1:" << s1 << endl;
}int main()
{test();return 0;
}
運行結果:?
與容量有關的函數
part 1
1)size_t size() const;
2)size_t capacity() const;
3)bool empty() const;
4)void clear();
#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world!");cout << "size:" << s1.size() << endl;cout << "capacity:" << s1.capacity() << endl;cout << "empty:" << s1.empty() << endl;s1.clear();cout << "After clear check empty:" << s1.empty() << endl;
}int main()
{test();return 0;
}
運行結果:
part 2
1)void resize(size_t n);
2)void resize(size_t n, char c);
?resize(size_t n)和resize(size_t n, char c)都是將字符串的有效個數改變到n個,不同的是,當使用?std::string::resize(size_t n)
?來增加字符串的大小時,新增加的字符默認是用空字符(null character,即?\0
)來填充,resize(size_t n, char c)則用字符c來填充多出來的元素空間。
當n小于原來字符串的個數時,相當于刪除操作,字符串將保留n個字符。
#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world!");s1.resize(20);cout << "s1:" << s1 << endl;string s2("welcom to C++");s2.resize(20, 'x');cout << "s2:" << s2 << endl;s1.resize(5);cout << "s1:" << s1 << endl;
}int main()
{test();return 0;
}
運行結果:
part 3
void reserve(size_t n = 0);
?std::string::reserve(size_t n)
函數用于請求字符串分配足夠的內存空間來存儲至少n
個字符(不包括終止的空字符'\0'
)。這并不意味著字符串的大小(即其中包含的字符數)會增加,它僅僅是預先分配了內存,以避免在未來添加字符時頻繁地重新分配內存。這樣做可以提高性能,因為內存分配通常是一個昂貴的操作。
#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello");cout << "s1.size:" << s1.size() << endl;cout << "s1.capacity:" << s1.capacity() << endl;s1.reserve(20);cout << "After reserve s1.size:" << s1.size() << endl;cout << "After reserve s1.capacity:" << s1.capacity() << endl;
}int main()
{test();return 0;
}
運行結果:
reserve之后的capacity為31,是因為vs自己的機制導致的,不同的編譯器結果可能會不一樣。
與訪問和遍歷有關的函數
1)char& operator[] (size_t pos);
2)const char& operator[] (size_t pos) const;
3)iterator begin();
4)const_iterator begin() const;
5)iterator end();
6)const_iterator end() const;
?const char& operator[] (size_t pos) const,const_iterator begin() const,const_iterator end() const,const修飾*this,即this指針指向的內容,所以this指針指向的內容不可修改,用法上和其他函數是一樣的。
#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world!");cout << s1[2] << endl;//類似數組的下標訪問string::iterator it = s1.begin();while (it != s1.end()){cout << *it << ' ';++it;}cout << endl;
}
int main()
{test();return 0;
}
運行結果:?
與修改有關的函數
1)string& operator+= (const string& str);
2)string& operator+= (const char* s);
3)string& operator+= (char c);
4)string& append(const char* s);
5)void push_back(char c);
6)string& insert(size_t pos, const char* s);
7)string& insert(size_t pos, size_t n, char c);
8)string& erase(size_t pos = 0, size_t len = npos);
這里列舉了較多的函數,但其實用法都大致相同,很容易做到舉一反三,所以這里就不一一舉例了。
#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello ");cout << "s1:" << s1 << endl;s1 += "world";cout << "s1 after +=: " << s1 << endl;cout << endl;string s2("Urspeacil");cout << "s2: " << s2 << endl;s2.append("chenyilan");cout << "s2 after append: " << s2 << endl;cout << endl;string s3("yyds");cout << "s3: " << s3 << endl;s3.push_back('y');cout << "s3 after push_back: " << s3 << endl;cout << endl;string s4("world peace");cout << "s4: " << s4 << endl;s4.insert(0, "I hope ");cout << "s4 after insert: " << s4 << endl;cout << endl;string s5("boy");cout << "s5: " << s5 << endl;s5.insert(1, 1, 'o');cout << "s5 after insert: " << s5 << endl;cout << endl;string s6("I love you!");cout << "s6: " << s6 << endl;s6.erase(6);cout << "s6 after erase: " << s6 << endl;
}
int main()
{test();return 0;
}
?運行結果:
npos
npos是一個靜態成員常量,表示一個不可能的位置。
#include <iostream>
#include <string>
using namespace std;int main()
{cout << "npos: " << string::npos << endl;return 0;
}
?運行結果:
string& erase(size_t pos = 0, size_t len = npos)上面講的的這個函數,形參len就給了npos為缺省值(默認值),表示如果不指定形參len,那么將刪除pos位置到字符串結尾的字符。
與string相關的其它常用函數
1)const char* c_str() const;
2)size_t find(char c, size_t pos = 0) const;
3)size_t rfind(char c, size_t pos = npos) const;
4)string substr(size_t pos = 0, size_t len = npos) const;
c_str() ,它主要用于將字符串類型的字符數組(包括C++字符串和C字符數組)轉換為C類型字符串,即以'\0'結尾的字符數組。
substr(),用于從字符串中提取子串。其函數原型為:std::string substr (size_t pos = 0, size_t len = npos) const;
,其中pos是子串的起始位置,len是子串的長度。如果len為std::string::npos或省略該參數,則子串將延續到原始字符串的末尾。
#include <iostream>
#include <string>
using namespace std;void test()
{string s1("hello world");cout << "c_str: " << s1.c_str() << endl;//找s1中的第一次出現的o并返回下標,可以用find()正著遍歷s1cout << "find: " << s1.find('o') << endl;//找s1中的最后出現的o并返回下標,可以用rfind()反著遍歷s1cout << "rfind: " << s1.rfind('o') << endl;string s2 = s1.substr(0, 5);cout << "s2: " << s2 << endl;
}int main()
{test();return 0;
}
運行結果:
常用非成員函數
1)istream& operator>> (istream& is, string& str);//流提取
2)ostream& operator<< (ostream& os, const string& str);//流插入
3)istream& getline(istream& is, string& str);
?流插入和流提取的使用很簡單,這里就不贅述了,討論getline和cin的區別更有意義。
getline和cin的區別
#include <iostream>
#include <string>
using namespace std;void test()
{string str;cin >> str;//輸入world peacecout << str;
}
int main()
{test();return 0;
}
運行結果:
可以看到,peace并未被讀取。原因在于:cin在遇到空白字符(空格、制表符、換行符)時會停止讀取,導致空白字符后面的內容無法讀取。
下面看看getline的表現:
#include <iostream>
#include <string>
using namespace std;void test()
{string str;getline(cin, str);//輸入world peacecout << str;
}
int main()
{test();return 0;
}
運行結果:
可以看到,getline可以讀取到空格后面的內容,原因在于getline一次從輸入流中讀取一行,直到遇到換行符(\n)才停止讀取。
完~?