順序容器---string詳解
阿新 • • 發佈:2019-01-11
前言
部落格編寫人:Willam
部落格編寫時間:2017/3/21
博主郵箱:2930526477@qq.com(有志同道合之人,可以加qq交流交流程式設計心得)
1、string的介紹
string是以char作為模板引數的模板類例項,把字串的記憶體管理責任由string負責而不是由程式設計者負責,大大減輕了C語言風格的字串的麻煩。
2、string的標頭檔案
#include<string>
using std::string;
3、string的常用的建構函式
1. string() //預設建構函式
2. string(const string & s);// 拷貝建構函式
3. string(const string & str,size_t pos,size_t len=nops) //substring
4. string(const char* s); //使用c風格的字串進行賦值
5. string(const char * s,size_t n);//前n個字元
6. string(inputIterator first,inputIterator last);
7. string (size_t n, char c);
Example:
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s0("A student"); //使用c風格
string s1(s0); //呼叫拷貝建構函式
string s2(s0, 2, 3); //呼叫子串那個建構函式,從下標2開始,拷貝三個
string s3("Another character sequence", 12);//取前12個字元
string s4(10, 'x'); //10個x,
string s5(s0.begin(),s0.end());//記住這個範圍為左閉右開區間
cout << s0 << endl;
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;
system("pause");
return 0;
}
輸出:
3、string的迭代器介紹
在這裡先介紹一下,string中有4種類的迭代器型別:
- iterator
- const_iterator //c++ 11才有的東西
- reverse_iterator
- const_reverse_iterator //c++ 11才有的東西
如果不知道迭代器是什麼,請參考:迭代器介紹
//迭代器begin(),返回的指向字串第一個字元的迭代器,它的建構函式如下
1. iterator begin()
2. const_iterator begin()
//只有我們的string型別是const型別時,才返回const_iterator,否則都返回iterator
//迭代器end(),返回指向字串最後一個字元的下一個位置的迭代器,它的建構函式如下:
1. iterator end()
2. const_iterator end()
//同樣,只有我們的string型別是const型別時,才返回const_iterator,否則都返回iterator
//迭代器rbegin(),用於逆序讀取串的內容,rbegin指向字串最後一個字元,它的建構函式如下:
1. reverse_iterator rbegin()
2. const_reverse_iterator rbegin()
//同樣,只有我們的string型別是const型別時,才返回const_reverse_iterator,否則都返回reverse_iterator
//迭代器rend(),用於逆序讀取串的內容,rend()指向字串第一個字元的前一個位置,它的建構函式如下:
1. reverse_iterator rend()
2. const_reverse_iterator rend()
//同樣,只有我們的string型別是const型別時,才返回const_reverse_iterator,否則都返回reverse_iterator
//迭代器rend(),用於逆序讀取串的內容,rend()指向字串第一個字元的前一個位置,它的建構函式如下:
1. reverse_iterator rend()
2. const_reverse_iterator rend()
//同樣,只有我們的string型別是const型別時,才返回const_reverse_iterator,否則都返回reverse_iterator
下面這些迭代器都是c++ 11才提出來的,他們返回的都是各自對應的迭代器常量。
1. cbegin() //對應begin,但是返回都是const_iterator
2. cend() //對應end,但是返回都是const_iterator
3. crbegin() //對應rbegin,但是返回都是const_reverse_iterator
4. crend() //對應rend,但是返回都是const_reverse_iterator
下面則是對迭代器的使用示例:
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "i am a student!";
//首先是對begin和end的使用
std::string::iterator start = s1.begin();
std::string::iterator end = s1.end(); //這個是指向無意義地址空間
//cout << *end << endl; 所以這裡會出現異常
//用迭代器遍歷字串。
cout << "遍歷字串" << endl;
while (start < end) {
cout << *start;
start = start + 1;
}
cout << endl;
cout << "輸出最後一個字元" << endl;
cout << *(end - 1) << endl;
cout << "逆序輸出字串" << endl;
std::string::reverse_iterator rstart = s1.rbegin();
std::string::reverse_iterator rend = s1.rend();
while (rstart < rend) {
cout << *rstart;
rstart = rstart + 1;
}
cout << endl;
//cout << *rend << endl; 這裡會出現異常,因為它指向字串第一個為的前一個位置
cout << "s1的cbegin返回的型別:" << typeid(s1.cbegin()).name() << endl;
const string s2 = "dsafsa";
cout << "常量s2的begin返回的型別:" << typeid(s2.begin()).name() << endl;
system("pause");
return 0;
}
輸出:
4、有關string的大小的操作函式
1. size() //返回字串的長度(\0以前的子串個數)
2. length() //和size()一模一樣
3. empty() //判斷字串的長度是否為0,不要用size和length判斷,empty的效率更高
4. max_size() //返回string所能包含的最多的字元數
5. resize() //這個函式有兩個版本,具體的介紹如下:
//void resize(size_type n, charT c)
//void resize(size_type n)
//改變string物件的內容為n個字元。
//如果n小於string物件的長度,內容被減少為前面的n個字元,後面的被清除。
//如果n大於string物件的長度,內容被附加需要的c字元以達到n個字元的長度。
//第二個函式實際呼叫resize(n, char()),如果n大於string物件的長度,新的字元位置填充char的預設值,null字元。
6. capacity() //返回需要重新分配記憶體前,string所能包含的最大字元數。(重新分配則會造成迭代器失效)
7. reserve() //修改capacity返回的值
8. clear() //清空字串。
9. shrink_to_fit() //c++ 11新標準 釋放size和capacity之前多餘的空間,最後會capacity和size返回值相同
使用示例:
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "i am a student!";
cout << "s1.size()=" << s1.size() << endl;
cout << "s1.lenght()=" << s1.length() << endl;
if (!s1.empty()) { cout << "s1不為空" << endl; }
cout << "s1.max_size()=" << s1.max_size() << endl;
cout << "s1.capacity()=" << s1.capacity() << endl;
//通過resize,取s1的前三個字元
s1.resize(3);
cout << "取前三個字元:" << s1 << endl;
s1.resize(5, 'n');
cout << "末尾新增兩個n:" << s1 << endl;
//通過reserve修改capacity,而且記住capacity只會增大,不會減少,所以
//如果reserve的引數小於size返回的值,則不會改變capacity返回的值
//s1.reserve(10),為改變capacity返回的值
s1.reserve(20);
//注意capacity返回的值可能大於等於40,這個是reserve自己的機制決定的
cout << "修改後s1.capacity()=" << s1.capacity() << endl;
//使用shrink_to_fit來釋放沒有使用的空間
s1.shrink_to_fit();
cout << "釋放沒有使用的空間後的capacity" << s1.capacity() << endl;
system("pause");
return 0;
}
輸出:
5、string元素的讀取
1. operator[] //運算子過載,但是它不會檢查下標是否溢位
2. at() //它是呼叫了下標運算子的,但是它會檢查下標是否溢位
3. back() //返回字串的最後一個字元
4. front() //返回字串的第一個字元
程式碼示例:
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s1 = "i am a student!";
cout << s1[0] << endl;
cout << s1.at(2) << endl;
cout << s1.front() << endl;
cout << s1.back() << endl;
system("pause");
return 0;
}
輸出:
6、改變string內容的函式或操作符
1. operator+= //在string串的尾部追加字元,可以是字元也可以是字串(c風格和string物件都可以)
2. append() //在string串的尾部追加內容,它有很多種過載型別,和string建構函式相似。(可參考:(http://www.cplusplus.com/reference/string/string/append/))
3. push_back() //追加一個字元到字串的末尾,引數為char
4. assign() //把字串原來的內容全部更換為新的內容
5. insert() //插入一個字元或字串到原來的字元中
6. erase() //刪除字串中內容
7. replace() //用字元或字串替換原串的部分內容
8. swap() //交換兩個字串的內容
9. pop_back() //刪除字串最後一個元素
7、字串的自己的操作函式
1. c_str() //原型為const char* c_str() ,返回的是const char *
2. data() //原型const char* data(),作用和c_str一樣,但是它返回的是不以‘\0’結尾的字串
3. copy() //原型size_t copy (char* s, size_t len, size_t pos = 0),取字串中某段子串賦給s。
4. find() //查詢字元或字串是否在原串中
5. rfind() //同find函式,從字串最後往前找字元或字串
6. find_first_of()//查詢包含子串中的任何字元,返回第一個位置
7. find_first_not_of() // 查詢不包含子串中的任何字元,返回第一個位置
8. find_last_of() //查詢包含子串中的任何字元,返回最後一個位置
9. find_last_not_of //查詢不包含子串中的任何字元,返回最後一個位置
10. substr() //返回子串,原型:string substr (size_t pos = 0, size_t len = npos)
8、string中npos介紹
//定義
static const size_type npos = -1;
//npos可以表示string的結束位子,是string::type_size 型別的,也就是find()返回的型別。find函式在找
//不到指定值得情況下會返回string::npos。