C++刷題tricks整理

haydenhs發表於2024-10-22

是自己做題中整理的常用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;
    }

相關文章