STL學習-string

string 簡介

string,是一個專門用於操做字符串的一個類,需包含頭文件<string>。注意與char*的區別,char*指向一塊連續的內存,用於存放字符串,<string.h>提供了字符串操做的一些方法,如strlen/strcmp等。算法

string 構造

簡單介紹幾種聲明方式,以下:數組

void StrDefine() {
    string str1;
    cout << str1 << endl;//類對象(str1)是不能直接輸出的,是由於string類中重載了運算符<<函數

    string str2(5, 'a');
    cout << str2 << endl;

    string str3("husong");
    cout << str3 << endl;

    string str4("husong", 2);
    cout << str4 << endl;

    string str5(str3, 2, 4);
    cout << str5 << endl;
}

string 屬性

這裏只簡單介紹幾個函數:capacity()/reserve()/empty()/length()/size()/resize()。見代碼註釋:安全

void StrCapacity() {

    string str1;
    cout << str1.capacity() << endl;// 輸出15,系統默認爲空string對象申請了15個字符對象空間


    string str2("husonghusonghusong");
    cout << str2.capacity() << endl;// 輸出31,大於15個字符時,系統又多申請了16個空間,vs編譯器規律:15+16+16...
                                    // vc編譯器規律:31+32+32...

    string str3("husong");
    cout << str3.capacity() << endl;// 默認輸出15
    str3.reserve(20);// 輸出31
    str3.reserve(10);// 輸出15,也就是說reserve()只能相對當前capacity大小擴大,不能縮小
                     //cout << str3.capacity() << endl;
}
void StrEmpty() {

    string str1;
    cout << str1.empty() << endl;// 輸出1,當字符串爲空,empty()返回true,不然返回false

    string str2("husong");
    cout << str2.empty() << endl;// 輸出0
}
void StrLengthSize() {

    string str1("husong");
    cout << str1.size() << endl;// 輸出6
    cout << str1.length() << endl;// 輸出6

    string str2("哈哈哈哈");// 一個漢字佔2個字節
    cout << str2.size() << endl;// 輸出8
    cout << str2.length() << endl;// 輸出8

    string str3("husong");
    str3.resize(2);// resize()做用與string對象,capacity不會變
    cout << str3 << endl;//輸出hu
    cout << str3.length() << endl;// 輸出2
    cout << str3.size() << endl;// 輸出2
    cout<< str3.capacity() <<endl;// 輸出15
}

string 輸出

對字符串無非是整串、子串、單個字符的使用。詳見註釋:app

void StrCout() {

    string str1("husong");
    cout << str1 << endl;// 前面註釋說過,其實是string內部重載了運算符<<函數
    cout << str1.c_str() << endl;// c_str() 函數實際返回的是string類中的 char* 指針

    string str2(str1, 0, 2);
    cout << str2 << endl;// 輸出子串
    
    cout << str1[1] << endl;// 輸出單個字符,實際上也是重載了運算符[]函數
    cout << str1.at(2) << endl;
}

string 修改

見代碼:函數

void StrChange() {

    string str1("husong");
    str1[1] = 's';
    cout << str1 << endl;

    str1.at(1) = 'y';
    cout << str1 << endl;

//如果修改其中某段子串,可利用循環修改
}
void StrInsert() {

    string str1("husong");

    string str2("zzzz");
    str2.insert(2, str1);// 在指定index前插入,第二個參數能夠爲指針或引用類型
    cout << str2 << endl;// 輸出 zzhusongzz

    string str3("oooo");
    str3.insert(2, str1, 2, 4);// 在指定index前插入子串
    cout << str3 << endl;// 輸出oosongoo

    string str4("iiii");
    str4.insert(1, str1, 4);
    cout << str4 << endl;// 輸出ingii

    str1.insert(1, 5, 'm');// 在指定index前插入n個字符
    cout << str1 << endl;// 輸出hmmmmmusong
}
void StrAppend() {

    string str1("Hello");

    string str2("World");
    str1.append(str2);// 尾部插入字符串,參數爲指針或引用
    cout << str1 << endl;// 輸出HelloWorld

    string str3("Hello");
    string str4("sssJamesssssss");// 尾部插入子串
    str3.append(str4, 3, 5);
    cout << str3 << endl;//輸出HelloJames
    
    string str5("Hello");
    string str6("World");
    str5.append(str6, 2);// 尾部插入字符串的子串(指定位置到尾部)
    cout << str5 << endl;// 輸出Hellorld

    string str7("Hello");
    str7.append(3, 'p');// 尾部插入n個字符
    cout << str7 << endl;// 輸出Helloppp
}

string 比較

void StrCompare() {

    string str1("abcd");
    string str2("abc");
    string str3("abcd");
    string str4("sabcd");

    cout << str1.compare(str2) << endl;// 1
    cout << str2.compare(str1) << endl;// -1
    cout << str1.compare(str3) << endl;// 0
    cout << str4.compare(3, 3, str1) << endl;// -1
    cout << str4.compare(4, 2, str1, 1, 2) << endl;// 0
}

string 拷貝

void StrCopy() {

    string str1("husong");
    char str2[8] = {0};
    str1.copy(str2, 2, 9);// 參數1:目標字符數組  參數2:拷貝長度  參數3:起始index
                          // 這裏會報錯,緣由是copy方法第3個參數可能會致使str2數組越界,不安全
                          // 解決方式:添加#pragma warning(disable:4996),預編譯時不報4996錯
    cout << str2 << endl;
}

string 查找和獲取子串

void StrSubStr() {

    string str1("husong");
    string str2;
    str2 = str1.substr(2, 4);
    cout << str2 << endl;//輸出song
}

void StrFind() {

    string str1("abcdefg");
    string str2("def");

    int index = 0;
    index = (int)str1.find(str2, 0);// 在str1中從0位置開始查找str2,若是找不到,轉爲int,結果爲-1
    cout << index << endl;// 輸出3
}

string 交換

void StrSwap() {

    string str1("ttttttttttt");
    string str2("uuuuuuuuuuu");

    str1.swap(str2);
    cout << str1 << " " << str2 << endl;
}

string 迭代器

迭代器其實就是一個指向容器元素的指針,能夠經過容器的begin()/end()改變迭代器的指向,這裏需注意迭代器失效的狀況,見註釋。指針

void StrIterator() {
    string str1("husong");
    string::iterator iter = str1.begin();
    for (iter; iter != str1.end(); ++iter) {
        cout << *iter << " ";
    }
    cout << endl;

    str1.append(15, 'm');// 這句代碼,系統會從新分配31個字符空間(vs編譯器),把原來的str1拷貝過來,但此時iter的指向並未改變
    iter = str1.begin();// 把iter指向新的內存首便可
    iter[1] = 'o';
    cout << str1 << endl;    
}

string 算法舉例

void fun(char c) {
    cout << c <<" ";
}
void StrAlr() {
    string str1("husong");
    for_each(str1.begin(), str1.end(), fun);

    sort(str1.begin(), str1.end());// 默認從小到大排序    
    cout << endl;
    for_each(str1.begin(), str1.end(), fun);

    sort(str1.begin(), str1.end(), greater<char>());//從大到小, greater<char>()仿函數,需導入頭文件<functional>
    cout << endl;
    for_each(str1.begin(), str1.end(), fun);
}
相關文章
相關標籤/搜索