是自己做題中整理的常用C++操作,此為存檔。
STL容器
容器介面卡,STL裡面的vector/array/deque/set/map/unordered_set可以直接使用==比較是否相等:
vector<int> a; deque<int> a; map<int, string> a;
unordered_map<int, string> a;
set<int> a;
unordered_set<int> a;
forward_list<int> a; // 單向連結串列 list<int> a; // 雙向連結串列 priority_queue<int> a; // 最大堆 stack<int> a; // 棧模擬 queue<int> a; // 佇列模擬
unordererd_set的查詢(C++20):
unordered_set<int> hash; bool result = hash.contains(a);
priority_queue自定義比較函式:
std::less<int>() std::greater<int>() [](int a, int b)(return a<b;);
unordered_set自定義hash函式:
#include <iostream> #include <unordered_set> #include <string> #include <utility> // for std::pair // 自定義雜湊函式 struct pair_hash { template <class T1, class T2> std::size_t operator() (const std::pair<T1, T2>& p) const { auto hash1 = std::hash<T1>{}(p.first); auto hash2 = std::hash<T2>{}(p.second); return hash1 ^ hash2; // 組合兩個雜湊值,使用XOR } }; int main() { // 使用自定義雜湊函式 std::unordered_set<std::pair<std::string, std::string>, pair_hash> dp; // 插入一些元素 dp.insert({"hello", "world"}); dp.insert({"foo", "bar"});return 0; }
泛型演算法
求最大最小:
std::min_element(a.begin(), a.end());
std::max_element(a.begin(), a.end());
二分搜尋(要求有序):
it = std::upper_bound(a.begin(), a.end(), val); // *it > val it = std::lower_bound(a.begin(), a.end(), val); //*it >= Val
* 如果找不到的話,會返回a.end()
* 如果使用的是std::binary_search的話,只能返回一個bool值,並且還要提前保證陣列有序
* 如果是想求等於某元素的情況,可以用:
// 從開始位置到i位置=k的結果 upper_bound(nums.begin(), nums.begin()+i+1, k) - lower_bound(nums.begin(), nums.begin()+i+1, k);
使用<numeric>的accumulate迭代器求和:
int sum = stdaccumulate(vec.begin(), vec.end(), 0);
使用fill函式填充:
std::fill(a.begin(), a.end(), 1);
在STL的泛型函式中使用謂詞:
int evenCount = std::count_if(vec.begin(), vec.end(), [](int n) {return n % 2 == 0;}); std::sort(vec.begin(), vec.end(), compare);
使用STL裡面的copy操作(from origin to destination),注意copy的第二個引數是尾後迭代器
字串
字串切片
sub = str.substr(7, 5); // start at 7 length 5 sub = str.substr(5); // start at 5 length to the end
與c風格字串的轉化
string str = std::to_string(pi); // int, float to string const char* cstr = str.c_str();
讀取字元流並提取單個單詞
std::vector<std::string> splitString(const std::string& str){ std::vector<std::string> result; std::stringstream ss(str); std::string word; // 使用流提取運算子 (>>) 從字串流中逐個提取單詞 while (ss >> word) { result.push_back(word); } return result; }