string,是一個專門用於操做字符串的一個類,需包含頭文件<string>
。注意與char*
的區別,char*
指向一塊連續的內存,用於存放字符串,<string.h>
提供了字符串操做的一些方法,如strlen/strcmp等。算法
簡單介紹幾種聲明方式,以下:數組
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; }
這裏只簡單介紹幾個函數: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 }
對字符串無非是整串、子串、單個字符的使用。詳見註釋: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; }
見代碼:函數
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 }
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 }
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; }
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 }
void StrSwap() { string str1("ttttttttttt"); string str2("uuuuuuuuuuu"); str1.swap(str2); cout << str1 << " " << str2 << endl; }
迭代器其實就是一個指向容器元素的指針,能夠經過容器的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; }
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); }