STL String類 基本操作
阿新 • • 發佈:2021-06-29
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