1. 程式人生 > >順序容器---string詳解

順序容器---string詳解

前言

部落格編寫人: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。