C++ STL學習筆記-C++ STL基礎

来源:https://www.cnblogs.com/ahappyfool/archive/2023/03/01/17169760.html
-Advertisement-
Play Games

約定 口 = 1 Byte,用於具象化,方便眼睛對比長度; void = 空類型; C語言中,short、long、singned、unsigned都為說明符,可以改變標識符存儲大小; C語言中,在聲明整型變數時,如果聲明中已經有一個其他的(同等)說明符,那麼關鍵字int可以省略; C語言中,預設使 ...


僅自己回憶使用,若有侵權,聯繫刪除

algorithm實用庫函數

sort:迭代器類型必須為隨機訪問迭代器(first,last),應該支持< 運算符,可以自己寫比較

nth_element() > partial_sort() > sort() > stable_sort()       <--從左到右,性能由高到低

  1. 如果需要對所有元素進行排序,則選擇 sort() 或者 stable_sort() 函數;
  2. 如果需要保持排序後各元素的相對位置不發生改變,就只能選擇 stable_sort() 函數,而另外 3 個排序函數都無法保證這一點;
  3. 如果需要對最大(或最小)的 n 個元素進行排序,則優先選擇 partial_sort() 函數;
  4. 如果只需要找到最大或最小的 n 個元素,但不要求對這 n 個元素進行排序,則優先選擇 nth_element() 函數。
  5. 在實際選擇排序函數時,應更多從所需要完成的功能這一角度去考慮,而不是一味地追求函數的性能。換句話說,如果你選擇的演算法更有利於實現所需要的功能,不僅會使整個代碼的邏輯更加清晰,還會達到事半功倍的效果。
函數名 用法
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp) 對容器或普通數組中 [first, last) 範圍內的元素進行排序,comare不寫預設升序。返回bool類型bool mycomp(int i, int j)
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp ); 和 sort() 函數功能相似,不同之處在於,對於 [first, last) 範圍內值相同的元素,該函數不會改變它們的相對位置。
void partial_sort (RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); 從 [first,last) 範圍內,篩選出 muddle-first 個最小的元素併排序存放在 [first,middle) 區間中。
RandomAccessIterator partial_sort_copy (InputIterator first, InputIterator last,RandomAccessIterator result_first,RandomAccessIterator result_last, Compare comp); 從 [first, last) 範圍內篩選出 result_last-result_first 個元素排序並存儲到 [result_first, result_last) 指定的範圍中。值得一提的是,[first, last] 中的這 2 個迭代器類型僅限定為輸入迭代器,這意味著相比 partial_sort() 函數,partial_sort_copy() 函數放寬了對存儲原有數據的容器類型的限制。換句話說,partial_sort_copy() 函數還支持對 list 容器或者 forward_list 容器中存儲的元素進行“部分排序”,而 partial_sort() 函數不行。
bool is_sorted (ForwardIterator first, ForwardIterator last, Compare comp); 檢測 [first, last) 範圍內是否已經排好序,預設檢測是否按升序排序。
ForwardIterator is_sorted_until (ForwardIterator first, ForwardIterator last, Compare comp); 和 is_sorted() 函數功能類似,唯一的區別在於,如果 [first, last) 範圍的元素沒有排好序,則該函數會返回一個指向首個不遵循排序規則的元素的迭代器。
void nth_element (RandomAccessIterator first,RandomAccessIterator nth,RandomAccessIterator last,Compare comp); 找到 [first, last) 範圍內按照排序規則(預設按照升序排序)應該位於第 nth 個位置處的元素,並將其放置到此位置。同時使該位置左側的所有元素都比其存放的元素小,該位置右側的所有元素都比其存放的元素大。
對於list有自己專有的sort

remove:ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)

fill:在 #include <algorithm> 頭⽂件中,使⽤⽅法: fill(begin,end,val); fill(e[0], e[0] + 500 * 500, inf);

min : const T& min (const T& a, const T& b, Compare comp);

	ForwardIterator min_element ( ForwardIterator first, ForwardIterator last )

swap:void swap (T& a, T& b);

replace:void replace (ForwardIterator first, ForwardIterator last,const T& old_value, const T& new_value);

count:difference_type count (InputIterator first, InputIterator last, const T& val);

reverse:reverse(begin(v), end(v))

next_permutation()

next_permutation() 和  // 頭⽂件 #include <algorithm> ,使⽤⽅法如下:
string s = "12345";  
do {  
cout << s << endl;  
}while(next_permutation(s.begin(), s.end()));  
最後得到54321

find:

InputIterator find (InputIterator first, InputIterator last, const T& val);
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);函數會根據指定的查找規則,在指定區域內查找第一個符合該函數要求(使函數返回 true)的元素。
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);和 find_if() 函數一樣,find_if_not() 函數也適用於所有的容器,包括所有序列式容器和關聯式容器。
所謂自定義查找規則,實際上指的是有一個形參且返回值類型為 bool 的函數。值得一提的是,該函數可以是一個普通函數(又稱為一元謂詞函數),比如:

bool mycomp(int i) {
  return ((i%2)==1);
}

目錄頁
C++ find_first_of()函數完全攻略
C++ find_end()函數詳解
C++ search()函數用法完全攻略
C++ search_n()函數用法(超級詳細)
set和map有專有的find,STL 標準庫提供有 count()、find()、lower_bound()、upper_bound() 以及 equal_range() 這些函數,而每個關聯式容器(除哈希容器外)也提供有相同名稱的成員方法

binary_search,lower_bound,upper_bound,

 //在 [first, last) 區域內查找不小於 val 的元素,也就是說,使用該函數在指定範圍內查找某個目標值時,最終查找到的不一定是和目標值相等的元素,還可能是比目標值大的元素。
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,const T& val);
//在 [first, last) 區域內查找第一個不符合 comp 規則的元素
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,const T& val, Compare comp);

//查找[first, last)區域中第一個大於 val 的元素。
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,const T& val);
//查找[first, last)區域中第一個不符合 comp 規則的元素
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,const T& val, Compare comp);

upper_bound() 函數的功能和 lower_bound() 函數不同,前者查找的是大於目標值的元素,而後者查找的不小於(大於或者等於)目標值的元素。
distance(upper_bound(),lower_bound())就是相等的個數

//equel_range() 函數的功能完全可以看做是 lower_bound() 和 upper_bound() 函數的合體。
//找到 [first, last) 範圍內所有等於 val 的元素
pair<ForwardIterator,ForwardIterator> equal_range (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);

//查找 [first, last) 區域內是否包含 val
bool binary_search (ForwardIterator first, ForwardIterator last,
                      const T& val);
//根據 comp 指定的規則,查找 [first, last) 區域內是否包含 val
bool binary_search (ForwardIterator first, ForwardIterator last,
                      const T& val, Compare comp);

string::npos 用法

string s = "abcdefg";int idx = s.find('.');   //作為return value,表示沒有匹配項if (idx == string::npos)    cout << "This string does not contain any period!" << endl;idx = s.find('c');s.replace(idx + 1, string::npos, "x");  string::npos作為長度參數,表示直到字元串結束cout << s;
  • 輸出結果:

    This string does not contain any period!abcx
    

merge:

OutputIterator merge (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp);
可以看到,first1、last1、first2 以及 last2 都為輸入迭代器,[first1, last1) 和 [first2, last2) 各用來指定一個有序序列;result 為輸出迭代器,用於為最終生成的新有序序列指定存儲位置;comp 用於自定義排序規則。同時,該函數會返回一個輸出迭代器,其指向的是新有序序列中最後一個元素之後的位置。

merge(first, first + 5, second, second + 6, myvector.begin());

void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);其中,first、middle 和 last 都為雙向迭代器,[first, middle) 和 [middle, last) 各表示一個有序序列。和 merge() 函數一樣,inplace_merge() 函數也要求 [first, middle) 和 [middle, last) 指定的這 2 個序列必須遵循相同的排序規則

inplace_merge(first, first + 5,first +11);

不同之處在於,merge() 函數會將最終合併的有序序列存儲在其它數組或容器中,而 inplace_merge() 函數則將最終合併的有序序列存儲在 [first, last) 區域中。
對於list有自己專有的merge

儘量不自己定義迭代器指針指向迭代器,以免發生意外,當然如果確定的話也可以。

vector

初始化:

  1. std::vector<double> values;通過reserve() 函數來增加容器的容量values.reserve(20);調用 reserve() 不會影響已存儲的元素,也不會生成任何元素已經大於或等於 20 個元素,那麼這條語句什麼也不做
  2. std::vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};
  3. std::vector<double> values(20);std::vector<double> values(20, 1.0);第二個參數指定了所有元素的初始值,因此這 20 個元素的值都是 1.0。值得一提的是,圓括弧 () 中的 2 個參數,既可以是常量,也可以用變數來表示,例如:int num=20;double value =1.0;std::vector<double> values(num, value);
  4. std::vector<char>value1(5, 'c'); std::vector<char>value2(value1);
  5. 可以用一對指針或者迭代器來指定初始值的範圍,例如:
    int array[]={1,2,3};
    std::vector<int>values(array, array+2);//values 將保存{1,2}
    std::vector<int>value1{1,2,3,4,5};
    std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保{1,2,3}
    
函數成員 函數功能
begin() 返回指向容器中第一個元素的迭代器。
end() 返回指向容器最後一個元素所在位置後一個位置的迭代器,通常和 begin() 結合使用。
rbegin() 返回指向最後一個元素的迭代器。
rend() 返回指向第一個元素所在位置前一個位置的迭代器。
cbegin() 和 begin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
cend() 和 end() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crbegin() 和 rbegin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crend() 和 rend() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
size() 返回實際元素個數。
max_size() 返回元素個數的最大值。這通常是一個很大的值,一般是 232-1,所以我們很少會用到這個函數。
resize() 改變實際元素的個數。
capacity() 返回當前容量。
empty() 判斷容器中是否有元素,若無元素,則返回 true;反之,返回 false。
reserve() 增加容器的容量。
shrink _to_fit() 將記憶體減少到等於當前元素實際所使用的大小。
operator[ ] 重載了 [ ] 運算符,可以向訪問數組中元素那樣,通過下標即可訪問甚至修改 vector 容器中的元素。
at() 使用經過邊界檢查的索引訪問元素。
front() 返回第一個元素的引用。
back() 返回最後一個元素的引用。
data() 返回指向容器中第一個元素的指針。
assign() 用新元素替換原有內容。
push_back() 在序列的尾部添加一個元素。
pop_back() 移出序列尾部的元素。
insert() 在指定的位置插入一個或多個元素。
erase() 移出一個元素或一段元素。
clear() 移出所有的元素,容器大小變為 0。
swap() 交換兩個容器的所有元素。
emplace() 在指定的位置直接生成一個元素。
emplace_back() 在序列尾部生成一個元素。
語法格式 用法說明
iterator insert(pos,elem) 在迭代器 pos 指定的位置之前插入一個新元素elem,並返回表示新插入元素位置的迭代器。
iterator insert(pos,n,elem) 在迭代器 pos 指定的位置之前插入 n 個元素 elem,並返回表示第一個新插入元素位置的迭代器。
iterator insert(pos,first,last) 在迭代器 pos 指定的位置之前,插入其他容器(不僅限於vector)中位於 [first,last) 區域的所有元素,並返回表示第一個新插入元素位置的迭代器。
iterator insert(pos,initlist) 在迭代器 pos 指定的位置之前,插入初始化列表(用大括弧{}括起來的多個元素,中間有逗號隔開)中所有的元素,並返回表示第一個新插入元素位置的迭代器。
erase(pos) 刪除 vector 容器中 pos 迭代器指定位置處的元素,並返回指向被刪除元素下一個位置元素的迭代器。該容器的大小(size)會減 1,但容量(capacity)不會發生改變。
erase(beg,end) 刪除 vector 容器中位於迭代器 [beg,end)指定區域內的所有元素,並返回指向被刪除區域下一個位置元素的迭代器。該容器的大小(size)會減小,但容量(capacity)不會發生改變。
remove() 刪除容器中所有和指定元素值相等的元素,並返回指向最後一個元素下一個位置的迭代器。值得一提的是,調用該函數不會改變容器的大小和容量。
clear() 刪除 vector 容器中所有的元素,使其變成空的 vector 容器。該函數會改變 vector 的大小(變為 0),但不是改變其容量。

使用revise方法避免不必要擴容
不要使用vector<bool>
deque沒有data()和capacity()函數,但是它的前端插入比vector快

array:還支持比較功能和字元串比較差不多

初始化:std::array<double, 10> values {0.5,1.0,1.5,,2.0};類似普通數組初始化

成員函數 功能
begin() 返回指向容器中第一個元素的隨機訪問迭代器。
end() 返回指向容器最後一個元素之後一個位置的隨機訪問迭代器,通常和 begin() 結合使用。
rbegin() 返回指向最後一個元素的隨機訪問迭代器。需要註意的是,在使用反向迭代器進行 ++ 或 – 運算時,++ 指的是迭代器向左移動一位,-- 指的是迭代器向右移動一位,即這兩個運算符的功能也“互換”了。
rend() 返回指向第一個元素之前一個位置的隨機訪問迭代器。
cbegin() 和 begin() 功能相同,只不過在其基礎上增加了 const 屬性,不能用於修改元素。
cend() 和 end() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crbegin() 和 rbegin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crend() 和 rend() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
size() 返回容器中當前元素的數量,其值始終等於初始化 array 類的第二個模板參數 N。
max_size() 返回容器可容納元素的最大數量,其值始終等於初始化 array 類的第二個模板參數 N。
empty() 判斷容器是否為空,和通過 size()==0 的判斷條件功能相同,但其效率可能更快。
at(n) 返回容器中 n 位置處元素的引用,該函數自動檢查 n 是否在有效的範圍內,如果不是則拋出 out_of_range 異常。和[]類似,只是中括弧不檢查
front() 返回容器中第一個元素的直接引用,該函數不適用於空的 array 容器。
back() 返回容器中最後一個元素的直接應用,該函數同樣不適用於空的 array 容器。
data() 返回一個指向容器首個元素的指針。利用該指針,可獲得容器中的各個元素從而實現複製容器中所有元素等類似功能。
fill(val) 將 val 這個值賦值給容器中的每個元素。
array1.swap(array2) 交換 array1 和 array2 容器中的所有元素,但前提是它們具有相同的長度和類型。

array、vector 和 deque 容器的函數成員

函數成員 函數功能 array<T,N> vector deque
begin() 返回指向容器中第一個元素的迭代器。
end() 返回指向容器最後一個元素所在位置後一個位置的迭代器,通常和 begin() 結合使用。
rbegin() 返回指向最後一個元素的迭代器。
rend() 返回指向第一個元素所在位置前一個位置的迭代器。
cbegin() 和 begin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
cend() 和 end() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crbegin() 和 rbegin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crend() 和 rend() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
assign() 用新元素替換原有內容。 -
operator=() 複製同類型容器的元素,或者用初始化列表替換現有內容。
size() 返回實際元素個數。
max_size() 返回元素個數的最大值。這通常是一個很大的值,一般是 232-1,所以我們很少會用到這個函數。
capacity() 返回當前容量。 - -
empty() 判斷容器中是否有元素,若無元素,則返回 true;反之,返回 false。
resize() 改變實際元素的個數。 -
shrink\ _to_fit() 將記憶體減少到等於當前元素實際所使用的大小。 -
front() 返回第一個元素的引用。
back() 返回最後一個元素的引用。
operator 使用索引訪問元素。
at() 使用經過邊界檢査的索引訪問元素。
push_back() 在序列的尾部添加一個元素。 -
insert() 在指定的位置插入一個或多個元素。 -
emplace() 在指定的位置直接生成一個元素。 -
emplace_back() 在序列尾部生成一個元素。 -
pop_back() 移出序列尾部的元素。 -
erase() 移出一個元素或一段元素。 -
clear() 移出所有的元素,容器大小變為 0。 -
swap() 交換兩個容器的所有元素。
data() 返回指向容器中第一個元素的指針。 -

deque:

函數成員 函數功能
begin() 返回指向容器中第一個元素的迭代器。
end() 返回指向容器最後一個元素所在位置後一個位置的迭代器,通常和 begin() 結合使用。
rbegin() 返回指向最後一個元素的迭代器。
rend() 返回指向第一個元素所在位置前一個位置的迭代器。
cbegin() 和 begin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
cend() 和 end() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crbegin() 和 rbegin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crend() 和 rend() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
size() 返回實際元素個數。
max_size() 返回容器所能容納元素個數的最大值。這通常是一個很大的值,一般是 232-1,我們很少會用到這個函數。
resize() 改變實際元素的個數。
empty() 判斷容器中是否有元素,若無元素,則返回 true;反之,返回 false。
shrink _to_fit() 將記憶體減少到等於當前元素實際所使用的大小。
at() 使用經過邊界檢查的索引訪問元素。
front() 返回第一個元素的引用。
back() 返回最後一個元素的引用。
assign() 用新元素替換原有內容。
push_back() 在序列的尾部添加一個元素。
push_front() 在序列的頭部添加一個元素。
pop_back() 移除容器尾部的元素。
pop_front() 移除容器頭部的元素。
insert() 在指定的位置插入一個或多個元素。
erase() 移除一個元素或一段元素。
clear() 移出所有的元素,容器大小變為 0。
swap() 交換兩個容器的所有元素。
emplace() 在指定的位置直接生成一個元素。
emplace_front() 在容器頭部生成一個元素。和 push_front() 的區別是,該函數直接在容器頭部構造元素,省去了複製移動元素的過程。
emplace_back() 在容器尾部生成一個元素。和 push_back() 的區別是,該函數直接在容器尾部構造元素,省去了複製移動元素的過程。
和 vector 相比,額外增加了實現在容器頭部添加和刪除元素的成員函數,同時刪除了 capacity()、reserve() 和 data() 成員函數。

stack

成員函數 功能
empty() 當 stack 棧中沒有元素時,該成員函數返回 true;反之,返回 false。
size() 返回 stack 棧中存儲元素的個數。
top() 返回一個棧頂元素的引用,類型為 T&。如果棧為空,程式會報錯。
push(const T& val) 先複製 val,再將 val 副本壓入棧頂。這是通過調用底層容器的 push_back() 函數完成的。
push(T&& obj) 以移動元素的方式將其壓入棧頂。這是通過調用底層容器的有右值引用參數的 push_back() 函數完成的。
pop() 彈出棧頂元素。
emplace(arg…) arg… 可以是一個參數,也可以是多個參數,但它們都只用於構造一個對象,併在棧頂直接生成該對象,作為新的棧頂元素。
swap(stack & other_stack) 將兩個 stack 適配器中的元素進行互換,需要註意的是,進行互換的 2 個 stack 適配器中存儲的元素類型以及底層採用的基礎容器類型,都必須相同。

quene:

成員函數 功能
empty() 如果 queue 中沒有元素的話,返回 true。
size() 返回 queue 中元素的個數。
front() 返回 queue 中第一個元素的引用。如果 queue 是常量,就返回一個常引用;如果 queue 為空,返回值是未定義的。
back() 返回 queue 中最後一個元素的引用。如果 queue 是常量,就返回一個常引用;如果 queue 為空,返回值是未定義的。
push(const T& obj) 在 queue 的尾部添加一個元素的副本。這是通過調用底層容器的成員函數 push_back() 來完成的。
emplace() 在 queue 的尾部直接添加一個元素。
push(T&& obj) 以移動的方式在 queue 的尾部添加元素。這是通過調用底層容器的具有右值引用參數的成員函數 push_back() 來完成的。
pop() 刪除 queue 中的第一個元素。
swap(queue &other_queue) 將兩個 queue 容器適配器中的元素進行互換,需要註意的是,進行互換的 2 個 queue 容器適配器中存儲的元素類型以及底層採用的基礎容器類型,都必須相同。

priority_queue<int,vector,cmp> cmp和sort的差不多

成員函數 功能
empty() 如果 queue 中沒有元素的話,返回 true。
size() 返回 queue 中元素的個數。
front() 返回 queue 中第一個元素的引用。如果 queue 是常量,就返回一個常引用;如果 queue 為空,返回值是未定義的。
back() 返回 queue 中最後一個元素的引用。如果 queue 是常量,就返回一個常引用;如果 queue 為空,返回值是未定義的。
push(const T& obj) 在 queue 的尾部添加一個元素的副本。這是通過調用底層容器的成員函數 push_back() 來完成的。
emplace() 在 queue 的尾部直接添加一個元素。
push(T&& obj) 以移動的方式在 queue 的尾部添加元素。這是通過調用底層容器的具有右值引用參數的成員函數 push_back() 來完成的。
pop() 刪除 queue 中的第一個元素。
swap(queue &other_queue) 將兩個 queue 容器適配器中的元素進行互換,需要註意的是,進行互換的 2 個 queue 容器適配器中存儲的元素類型以及底層採用的基礎容器類型,都必須相同。
和 stack 一樣,queue 也沒有迭代器,因此訪問元素的唯一方式是遍歷容器,通過不斷移除訪問過的元素,去訪問下一個元素。

map

pair

	#include <iostream>
	#include <utility>      // pair
	#include <string>       // string
	using namespace std;
	int main() {
	    // 調用構造函數 1,也就是預設構造函數
	    pair <string, double> pair1;
	    // 調用第 2 種構造函數
	    pair <string, string> pair2("STL教程","http://c.biancheng.net/stl/");  
	    // 調用拷貝構造函數
	    pair <string, string> pair3(pair2);
	    //調用移動構造函數
	    pair <string, string> pair4(make_pair("C++教程", "http://c.biancheng.net/cplus/"));
	    // 調用第 5 種構造函數
	    pair <string, string> pair5(string("Python教程"), string("http://c.biancheng.net/python/"));  
	   
	    cout << "pair1: " << pair1.first << " " << pair1.second << endl;
	    cout << "pair2: "<< pair2.first << " " << pair2.second << endl;
	    cout << "pair3: " << pair3.first << " " << pair3.second << endl;
	    cout << "pair4: " << pair4.first << " " << pair4.second << endl;
	    cout << "pair5: " << pair5.first << " " << pair5.second << endl;
	    return 0;
}
//pair類模板還提供有一個 swap() 成員函數,能夠互換 2 個 pair 對象的鍵值對,其操作成功的前提是這 2 個 pair 對象的鍵和值的類型要相同。

unordered_map和unordered_set
C++ STL關聯式容器(map,set)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境 vue2 導入 安裝npm包 echarts echarts-gl import * as echarts from "echarts" import "echarts-gl" html <div id="map-container"></div> js import GeoZJ from ' ...
  • RxEditor是一款開源企業級可視化低代碼前端,目標是可以編輯所有 HTML 基礎的組件。比如支持 React、VUE、小程式等,目前僅實現了 React 版。 RxEditor運行快照: 項目地址:https://github.com/rxdrag/rxeditor 演示地址( Vercel 部 ...
  • 如何畫好一張架構圖,要做好這件事情首先要回答的就是什麼是架構圖。我們日常工作中經常能看到各種各樣的架構圖,而且經常會發現大家對架構圖的理解各有側重。深入追究到這個問題,可能一下子還很難有一個具象的定義,如果我們把這個問題進行拆分,理解起來就會容易一點。 ...
  • 1. JPA 1.1. 性能直接受底層JDBC驅動性能的影響 1.2. 性能提升是通過改變實體類的位元組碼來實現的 1.2.1. 在類載入到JAR文件或者由JVM運行之前增強位元組碼的方法 1.2.1.1. 在編譯過程中完成的 1.2.1.2. 在實體類編譯完成後,它們會被傳遞給一個特定實現的後置處理器 ...
  • 一、前戲 在之前我們已經學會使用 pytest-html 插件生成 html 格式的測試報告: 1 # 第一步,安裝插件 2 pip install pytest-html 3 ​ 4 # 第二步,執行用例時使用 --html 參數 5 ## main 函數中執行 6 if __name__ == ...
  • MyBatis的關聯映射02 3.一對多 3.1基本介紹 mybatis – MyBatis 3 | XML 映射器 多對一關係也是一個基本的映射關係,多對一,也可以理解為一對多。例如: User--Pet:一個用戶可以有多只寵物 Dep--Emp:一個部門有多個員工 雙向的多對一關係:通過User ...
  • 背景 公司目前主要聚焦於視頻這個領域,利用視頻為媒體、文旅、會議等行業進行賦能。 既然聚焦於視頻領域,那麼視頻轉碼則是繞不開的話題。 為了降低成本,以及保證產品的核心能力,公司自建了一套轉碼系統。 轉碼服務除了儘可能多的相容業界的視頻格式外,轉碼的速度是另一個非常重要的指標。 因為視頻轉碼對用戶來說 ...
  • 一、固件使用背景 在執行測試用例時,我們常常需要在測試用例執行的前後去完成一些額外的操作。例如針對於 Web 測試,在用例執行前需要打開瀏覽器,完成用戶登錄等一系列前置操作;在用例執行完成後,要清除瀏覽器緩存,關閉瀏覽器...... Pytest 框架提供的固件機制(又稱為夾具)可以幫我們實現一系列 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...