文章目錄
- 前言
- 一、 string類
- 二、 string類的常用函式
- 1.建構式
- 2.賦值運算子多載
- 3.三種遍歷方式
- (1)operator[]多載、下標
- (2)范圍for
- (3)迭代器
- 4.資料的插入與洗掉
- (1)尾部插入資料
- (2)insert任意位置插入資料
- (3)erase任意位置清除資料
- 5.resize與reserve
- (1)resize
- (2)reserve
- 6.c_str
- 7.查找
- 8.getline
- 感謝閱讀,如有錯誤請批評指正
前言
STL中的內容很多,所以文章中只介紹最常用、最好用的一部分,如果需要用到剩余的一些內容,可以到C++的官方網站上查找,
一、 string類
C語言中沒有字串這一型別,只能通過char陣列來間接實作,字串是以’\0’結尾的一些字符的集合,為了操作方便,C標準庫中提供了一些str系列的庫函式,但是這些庫函式與字串是分離開的,而且底層空間需要用戶自己管理,可能還會非法訪問,
string是表示字串的字串類,該類的介面與常規容器的介面基本相同,再添加了一些專門用來操作string的常規操作,包含在string頭檔案下(注意不是string.h),
二、 string類的常用函式
1.建構式
STL庫中給出了下面7個建構式,其中(1)、(2)和(4)最常用

使用如下:
int main()
{
string s1;
string s2("hello world");
string s3(s2);
return 0;
}
結果如下:

2.賦值運算子多載

代碼如下:
int main()
{
std::string str1, str2, str3;
str1 = "hello world";
str2 = 'x';
str3 = str1;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
return 0;
}
結果如下:

3.三種遍歷方式
(1)operator[]多載、下標
下面的代碼中s.size()回傳string中有效字符的個數(即不包含\0),
代碼如下:
int main()
{
string s = "12345";
size_t i = 0;
for (i = 0; i < s.size(); i++)
cout << s[i] << " ";
cout << endl;
return 0;
}
結果如下:

(2)范圍for
代碼如下:
int main()
{
string s = "12345";
for (auto e : s)
cout << e << " ";
cout << endl;
return 0;
}
結果如下:

(3)迭代器
迭代器是各種STL容器遍歷時通用的方法,對于string、vector這種簡單的容器來說可能與其他遍歷方法差不多,但到之后復雜的容器時用迭代器遍歷是最方便的,
代碼如下:
int main()
{
string s = "12345";
string::iterator it = s.begin();//前面加string告訴編譯器找string類里的iterator
//而不是去找其他容器的iterator
while (it != s.end())//注意判斷條件
{
cout << *it << " ";
it++;//it向后遍歷
}
cout << endl;
return 0;
}
結果如下:

begin()回傳第一個字符的迭代器、end()回傳最后一個字符下一個位置的迭代器,
這里是第一次遇到迭代器,可以暫時將其理解為一個指標,但迭代器不一定全是指標,即下面的寫法:
代碼如下:
class string
{
public:
typedef char* iterator;
//...
private:
//...
}
還有反向迭代器可實作反向遍歷,與上面正向迭代器同理,
代碼如下:
int main()
{
string s = "12345";
string::reverse_iterator it = s.rbegin();//ebegin()回傳最后一個字符的迭代器
while (it != s.rend())//rend()回傳第一個字符前一個位置的迭代器,
{
cout << *it << " ";
it++;//注意這里是++而不是--
}
cout << endl;
return 0;
}
結果如下:

由上可知,迭代器遍歷時區間是左閉右開的,即[begin(), end())、[rbegin(), rend()),begin()和rbegin()位置是可以被訪問的,而end()和rend()位置不能被訪問,
4.資料的插入與洗掉
(1)尾部插入資料
用push_back在字串末尾插入單個字符,用append插入字串,
代碼如下:
int main()
{
string s;
s.push_back('h');
s.push_back('e');
s.push_back('l');
s.push_back('l');
s.push_back('o');
s.push_back(' ');
cout << s << endl;
s.append("world");
cout << s << endl;
string s1 = "!!!";
s.append(s1);
cout << s << endl;
return 0;
}
結果如下:

但實際情況中多載的operator+=是最方便的,
代碼如下:
int main()
{
string s;
s += 'h';
s += 'e';
s += 'l';
s += 'l';
s += 'o';
s += ' ';
cout << s << endl;
s += "world";
cout << s << endl;
string s1 = "!!!";
s += s1;
cout << s << endl;
return 0;
}
結果如下:

注意:
(1)在string尾部追加字符時,push_back、append和+=三種的實作方式差不多,一般情況下string類的+=操作用的比較多,+=操作不僅可以連接單個字符,還可以連接字串,而且寫起來可讀性很好,
(2)對string操作時,如果能夠大概預估到要存盤多少個字符,可以通過reserve提前把空間預留好,
(2)insert任意位置插入資料
注意是在給定的位置(下標)之后插入資料,
代碼如下:
int main()
{
string s = "ad";
cout << s << endl;
s.insert(0, "bc");
cout << s << endl;
s.insert(4, "efg");
cout << s << endl;
s.insert(1000, "!!!");//一定要在合法的位置插入資料,否則會報錯
cout << s << endl;
return 0;
}
結果如下:

(3)erase任意位置清除資料
注意是在給定的位置(下標)之后清除資料,
代碼如下:
int main()
{
string s = "abcdefg";
s.erase(0, 1);//清除下標為0的位置后的1個資料
cout << s << endl;
s.erase(5, 10);//清除下標為5的位置后的10個資料,由于其后沒有10個資料,所以全部清除結束
cout << s << endl;
s.erase(2);//清除下標為2的位置后的所有資料
cout << s << endl;
return 0;
}
結果如下:

5.resize與reserve
(1)resize
改變一個string物件的size,即物件中有效字符的個數,
代碼如下:
int main()
{
string s1 = "abcd";
cout << "size:" << s1.size() << endl;
cout << "capacity:" << s1.capacity() << endl;
cout << s1 << endl << endl;
s1.resize(2);//size大于給定的值,則只保留給定的值的內容
cout << "size:" << s1.size() << endl;
cout << "capacity:" << s1.capacity() << endl;
cout << s1 << endl << endl;
s1.resize(5);//size小于給定的值,多余的部分默認給\0
cout << "size:" << s1.size() << endl;
cout << "capacity:" << s1.capacity() << endl;
cout << s1 << endl << endl;
s1.resize(7, '!');//size小于給定的值,多余的部分也可給定,如這里給定為!
cout << "size:" << s1.size() << endl;
cout << "capacity:" << s1.capacity() << endl;
cout << s1 << endl << endl;
return 0;
}
結果如下:

注意上面結果中最后的字串中間出現了三個空格,這里其實是s1.resize(5);時默認填充的三個\0,但由于其是不可見字符,所以看起來是空格,
(2)reserve
即改變一個string物件的capacity,即物件中能存盤有效字符的最大個數,
代碼如下:
int main()
{
string s;
int prev = s.capacity();//獲取當前string物件的capacity大小
for (char ch = 0; ch < 127; ch++)
{
s += ch;
//發生增容時列印capacity的變化
if (prev != s.capacity())
{
cout << "capacity:" << prev << "-->>" << s.capacity() << endl;
prev = s.capacity();
}
}
return 0;
}
結果如下:

6.c_str
回傳C語言型別的字串,即遇到\0截止,
代碼如下:
int main()
{
string s = "abcd";
s.resize(6);
s += "!!!";
cout << s.c_str() << endl;
cout << s << endl;
return 0;
}
結果如下:

resize時不夠的兩個位置默認用\0補全,列印c_str遇到第一個\0即停止,而直接列印s會列印[0,s.size())的全部內容,
7.查找
find函式用來查找一個string物件內有無某一字符或字串并回傳下標,找不到回傳npos,
npos是string內的一個靜態成員,型別為unsigned int,值為無符號整型的最大值,
代碼如下:
int main()
{
string s = "hello world";
size_t pos = s.find(' ');
if (pos != string::npos)//判斷是否找到
{
for (; pos < s.size(); pos++)
cout << s[pos];
cout << endl;
}
size_t pos1 = s.find('z');
if (pos1 == string::npos)
cout << "找不到" << endl;
return 0;
}
結果如下:

同理也有rfind函式,即倒著查找某一字符或字串,此處不再贅述,
8.getline
cin相當于C語言中的scanf,遇到空格或換行停止讀入;getline相當于C語言中的gets,遇到換行停止讀入,
代碼如下:
int main()
{
string s;
getline(cin, s);//注意寫法
cout << s << endl << endl;
cin >> s;
cout << s << endl;
return 0;
}
結果如下:

感謝閱讀,如有錯誤請批評指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290142.html
標籤:其他
上一篇:我學編程時最后悔的事!
