1. 程式人生 > 其它 >STL String類 基本操作

STL String類 基本操作

Basic String Member Functions

string 模板類成員函式的基礎知識


Constructor建構函式

// 以下示例string構造方式

// 1.string(int num, char element);		含num個element字元的字串
// Demo
string test(19, 'H');	// "HHHHHHHHHHHHHHHHHHH"

// 2.string(string s, int start, int end);	已有字串構造
// 注:此處s要傳入變數,不可直接填寫string
//    end預設則為s.length() - 1
//Demo
string origin = "0123456789ABCDEFGH";
string test1(origin, 3, 11);	// "3456789ABCD"

// 3.string(string s, int num);		現有立即字串前num位構造 num預設則位s.length()
// 注:此處s需要直接填寫string不可變數傳遞
// Demo
string test2("0123456789ABCDEFGH", 3);	// "012"

// 4.\0結束符,直接截斷
// Demo
string test3("hahaha\0What's your name?");	// "hahaha"

// 5.string(Iterator first, Iterator last)已有string迭代器構造
// Demo
string origin = "0123456789ABCDEFGH";
string test1(origin.begin() + 3, origin.end() - 4);	// "3456789ABCD"

// 6.1.string(string& s)	利用已有字串變數直接構造副本
// 6.2.string(string&&)		利用多個已有字串變數拼接構造
// Demo
string origin = "0123456789ABCDEFGH";
string test1(origin);	// "0123456789ABCDEFGH"
string part1 = "Hello ";
string part2 = "World";
string test2(part1 + part2);

// 7.建立空string再賦值構造(最常見)
// Demo
string test = "Hello World";	// "Hello World"

Iterator迭代器

// 1.begin() end()		正向迭代器		可遍歷可修改原始資料
// 2.rbegin() rend()	反向迭代器		可遍歷可修改原視資料
// 3.cbegin() cend()	常量正向迭代器		可遍歷不可修改原視資料
// 4.crbegin() crend()	常量反向迭代器		可遍歷不可修改原始資料
// Demo
string origin = "0123456789ABCDEFGH";
for(auto it = origin.cbegin(); it != origin.cend(); it++) cout << *it;		// 0123456789ABCDEFGH
cout << endl;
for(auto it = origin.crbegin(); it != origin.crend(); it++) cout << *it;	// HGFEDCBA9876543210

Access元素訪問

/*
1.operator[]	訪問指定下標字元
2.at()			同上
3.front()		訪問第一個字元
4.back()		訪問最後一個字元
5.data()		返回指向首個元素的常量指標
*/
// Demo
string origin = "0123456789ABCDEFGH";
cout << origin[0] << endl;		// 0
cout << origin.at(7) << endl;	// 7
cout << origin.front() << endl;	// 0
cout << origin.back() << endl;	// H
const char* p = origin.data();
cout << p << endl;	// 0123456789ABCDEFGH

Switch轉換

1.string模板類字串轉const char陣列
// Demo
string s = "Hello World!";
const char* p = s.c_str();
2.string to int / long int / long long int / …字串轉整型
// Demo
string test = "3124923";
cout << stoi(test) << endl;		// string to int
cout << stol(test) << endl;		// string to long int
cout << stoll(test) << endl;	// string to long long int
cout << stoul(test) << endl;	// string to unsigned long int
cout << stoull(test) << endl;	// string to unsigned long long int
cout << stof(test) << endl;		// string to float
cout << stod(test) << endl;		// string to double
cout << stold(test) << endl;	// string to long double
3.to_string整型(double / int / float …)轉字串
// Demo
double num = 134.2134;
cout << to_string(num) << endl;

// to_wstring	可轉換為寬字元(非ASCII編碼字元,如Unicode字元)

Memory儲存相關

// 1.empty	判斷string是否為空
// Demo
string s;
string k = "Hello World";
s.empty();	// True
k.empty();	// False

// 2.size length	返回string中儲存的字元數目
// Demo
string test = "Hello World";
cout << test.size() << endl;	// 11
cout << test.length() << endl;	// 11

// 3.max_size	string.size() 返回string的最大size

// 4.capacity	返回string的預留儲存空間
/*
Tips:string.capacity() != string.size()
capacity是實際佔用空間,其中預留了空間給將要新增的元素,而size位實際已有元素所佔空間大小,每當size達到capacity,capacity會變為原有1.5倍進行擴容
*/

// 5.reserve(int capacity)	設定capacity大小,預設則不改變
// Demo
string s = "Hello World";	// s.capacity() == 15
s.reserve(3);			// 不改變
s.reserve(300);			// 變為300

// 6.shrink_to_fit	使capacity為能滿足size儲存的最低容量
// Demo
string s = "Hello World";	// s.capacity() == 15, s.size() == 11
s.reserve(300);		// s.capacity() == 300
s.shrink_to_fit();		// s.capacity() == 15

Operations操作

1.clear 清空內容
// Demo
string test = "Hello World";
    cout << test << endl;	// "Hello World"
    test.clear();
    cout << test.size() << " " << test.capacity() << endl;	// 0 15
2.insert(int start, string s) 指定位置開始插入字串
// Demostring s = "0123456789ABCDEFGH";s.insert(3, "Hello World");		// 012Hello World3456789ABCDEFGH
3.erase 刪除指定字元
// Demo// 輸入數字實參string s = "This is an example";	// This is an examples.erase(0, 5);	// is an example	刪除下標[0, 5)的內容s.erase(s.find(' '));	// isan		第二個引數預設,預設為末尾// 輸入迭代器實參(InputIterator std::find())string k = "Hello World"k.erase(std::find(k.begin(), k.end(), ' ')); // HelloWorld	僅刪除空格// 數字實參-範圍性刪除;迭代器實參-單字元刪除
4.void push_back(char ch) 字串末尾新增字元
// Demostring s = "0123456789ABCDEFGH";	// 0123456789ABCDEFGHs.push_back('I');					// 0123456789ABCDEFGHI
5.void pop_back() 彈出字串末尾字元(並不返回被彈出字元)
// Demostring s = "I love you a";s.pop_back();	// 刪除末尾'a'
6.void append() 字串末尾新增字串
// Demostring s = "You love ";s.append("Me");		// "You love Me"
7.operator+=
// Demostring s = "Today ";s += "is a good day!"	// "Today is a good day!"
8.int compare() 比較兩個字串(忽略大小寫後)字母序中相對順序
// Demo/*string1.compare(string2)string1 > string2 		返回1string1 == string2		返回0string1 < string2		返回-1*/// Demostring s1 = "I'm come from Chinese";string s2 = "I'm come from American";cout << s1.compare(s2) << endl;	
9.void replace() 替換指定範圍的字元為目標字串
// Demostring s1 = "I'm come from Chinese";s1.replace(0, 7, "Dog");	// Doge from Chinese
10.string substr(int start, int length) 返回從start下標開始的length個字元所組成的子字串(start預設為0, length預設則直至末尾)
// Demostring s1 = "I'm come from Chinese";s1 = s1.substr(6);	// me from Chinese
11.void copy(char* chararray, int size) 從string型別中copy尺寸為size的資料到一個char數字裡
// Demostring s = "hahahhahahahah";char p[100];s.copy(p, sizeof(p));
12.void resize(int new_size, char ch) 重新設定string的size,比原來小則截斷多餘,比原來大則用ch填充新增size(ch 預設為‘\0’)
// Demostring s = "hahahhahahahah";s.resize(3);	// hahcout << s << endl;s.resize(30, 'k');	// hahkkkkkkkkkkkkkkkkkkkkkkkkkkkcout << s << endl;
13.swap(string s) 兩個string互換內容
// Demostring s1 = "Hello ";string s2 = "World ";cout << s1 << s2 << endl;	// Hello World  s1.swap(s2);cout << s1 << s2 << endl;	// World Hello 

Find查詢

1.int find(string s / char ch, int start) 從start索引(預設為0)開始查詢目標字元或字串
同時,還提供 rfind() 反向查詢,返回查詢到的最後一個下標

若查詢到則返回第一個查詢到的下標,否則返回string::npos(該值常用於迴圈條件中)

// Demostring test = "You Hello Yellow Yeah!";cout << test.find("Y") << endl;		// 0cout << test.rfind("Y") << endl;	// 17