核心内容摘要
VideoAgentTrek Screen Filter艺术化处理案例:将代码编程过程转化为动态数字艺术
1ã€�é��修改åº�列算法这些算法ä¸�会改å�˜å®ƒä»¬æ‰€æ“�作的容器ä¸çš„å…ƒç´ ã€‚
1 find å’Œ find_iffind(begin, end, value)查找第一个ç‰äº�valueçš„å…ƒç´ è¿”å›�è¿ä»£å™¨æœªæ‰¾åˆ°è¿”å›�end。find_if(begin, end, predicate)查找第一个满足谓è¯�çš„å…ƒç´ ã€‚find_end(begin, end, sub_begin, sub_end)查找å�åº�列最å��一次出ç�°çš„ä½�置。vectorint nums {1, 3, 5, 7, 9}; // 查找值为5çš„å…ƒç´ auto it find(nums.begin(), nums.end(),
; if (it ! nums.end()) { cout found: *it endl; // 输出5 } // 查找第一个大äº�6çš„å…ƒç´ auto it2 find_if(nums.begin(), nums.end(), [](int x) { return x 6; }); cout first 6: *it2 endl; // 输出7 // 查找å�åº�列 vectorint sub {3, 5}; auto it3 find_end(nums.begin(), nums.end(), sub.begin(), sub.end()); if (it3 ! nums.end()) { cout subsequence starts at index: it3 - nums.begin() endl; // 输出1 }
2 count å’Œ count_ifcount(begin, end, value)统计ç‰äº�valueçš„å…ƒç´ ä¸ªæ•°ã€‚count_if(begin, end, predicate)统计满足谓è¯�predicateçš„å…ƒç´ ä¸ªæ•°ã€‚std::vectorint vec {1, 2, 3, 2, 4, 2}; int cnt std::count(vec.begin(), vec.end(),
; // 计数2的个数结�为3 int even_cnt std::count_if(vec.begin(), vec.end(), [](int x) { return x % 2 0; }); // �数个数结�为
4
3 for_each对范围内的æ¯�ä¸ªå…ƒç´ åº”ç”¨ä¸€ä¸ªå‡½æ•°std::vectorint vec {1, 2, 3, 4, 5}; std::for_each(vec.begin(), vec.end(), [](int x) { x * 2; // å°†æ¯�ä¸ªå…ƒç´ ä¹˜ä»¥2 }); // ç�°åœ¨vecå�˜ä¸º{2, 4, 6, 8, 10}
4 equal � mismatchequal(b1, e1, b
判æ–两个范围[b1,e
和[b2, b2(e1-b
)是å�¦ç›¸ç‰ã€‚mismatch(b1, e1, b
è¿”å›�两个范围ä¸ç¬¬ä¸€ä¸ªä¸�相ç‰å…ƒç´ çš„è¿ä»£å™¨å¯¹pair。vectorint a {1, 2, 3}; vectorint b {1, 2, 4}; vectorint c {1, 2, 3, 4}; // 比较aå’Œbçš„å‰�3ä¸ªå…ƒç´ bool is_equal equal(a.begin(), a.end(), b.begin()); cout a b? boolalpha is_equal endl; // 输出false // 查找aå’Œc的第一个ä¸�匹é…�å…ƒç´ auto mis mismatch(a.begin(), a.end(), c.begin()); if (mis.first ! a.end()) { cout mismatch: *mis.first vs *mis.second endl; // æ— è¾“å‡ºaå’Œcå‰�3å…ƒç´ ç›¸ç‰ }
5 all_of, any_of, none_ofæ£€æŸ¥èŒƒå›´å†…å…ƒç´ æ˜¯å�¦å…¨éƒ¨ã€�å˜åœ¨æˆ–没有满足æ�¡ä»¶çš„std::vectorint vec {2, 4, 6, 8}; bool all_even std::all_of(vec.begin(), vec.end(), [](int x) { return x % 2 0; }); // true bool any_odd std::any_of(vec.begin(), vec.end(), [](int x) { return x % 2 ! 0; }); // false bool none_negative std::none_of(vec.begin(), vec.end(), [](int x) { return x 0; }); // true2ã€�修改åº�列算法这些算法会修改它们所æ“�作的容器ä¸çš„å…ƒç´ ã€‚
1 copy å’Œ copy_ifcopy(begin, end, dest)å°†[begin, end)ä¸çš„å…ƒç´ å¤�制到dest开始的ä½�置。copy_if(begin, end, dest, predicate)å¤�制满足谓è¯�çš„å…ƒç´ åˆ°dest。vectorint src {1, 2, 3, 4, 5}; vectorint dest(
; // 需预先分é…�足够空间 // å¤�åˆ¶æ‰€æœ‰å…ƒç´ copy(src.begin(), src.end(), dest.begin()); // dest: [1,2,3,4,5] // å¤�制å�¶æ•°å…ƒç´ 到新容器 vectorint evens; copy_if(src.begin(), src.end(), back_inserter(evens), [](int x) { return x % 2 0; }); // evens: [2,4]注æ„�back_inserter(dest)会自动调用push_backæ— éœ€æ��å‰�分é…�空间。
2 transform对范围内的æ¯�ä¸ªå…ƒç´ åº”ç”¨ä¸€ä¸ªå‡½æ•°å¹¶å°†ç»“æ�œå˜å‚¨åœ¨å�¦ä¸€ä¸ªèŒƒå›´å†…vectorint nums {1, 2, 3}; vectorint squares(
; // 计算平方å�•å�‚数转æ�¢ transform(nums.begin(), nums.end(), squares.begin(), [](int x) { return x * x; }); // squares: [1,4,9] // ä¸¤å®¹å™¨å…ƒç´ ç›¸åŠ å�Œå�‚数转æ�¢ vectorint a {1, 2, 3}; vectorint b {4, 5, 6}; vectorint sum(
; transform(a.begin(), a.end(), b.begin(), sum.begin(), [](int x, int y) { return x y; }); // sum: [5,7,9]
3 replaceã€�replace_ifä¸� replace_copyreplace(begin, end, old_val, new_val)将所有old_val替æ�¢ä¸ºnew_val。replace_if(begin, end, predicate, new_val)替æ�¢æ»¡è¶³è°“è¯�çš„å…ƒç´ ã€‚replace_copy(begin, end, dest, old_val, new_val)å¤�制时替æ�¢å…ƒç´ ä¸�修改å�Ÿå®¹å™¨ã€‚vectorint nums {1, 2, 3, 2, 5}; // 替æ�¢æ‰€æœ‰2为20 replace(nums.begin(), nums.end(), 2,
; // nums: [1,20,3,20,5] // 替æ�¢å¤§äº�10çš„å…ƒç´ ä¸º0 replace_if(nums.begin(), nums.end(), [](int x) { return x 10; },
; // nums: [1,0,3,0,5] // �制时替�3为300�容器�� vectorint res; replace_copy(nums.begin(), nums.end(), back_inserter(res), 3,
; // res: [1,0,300,0,5]
4 removeã€�remove_if ä¸� eraseremove(begin, end, value)å°†ç‰äº�valueçš„å…ƒç´ â€œç§»åŠ¨â€� 到容器末尾返å›�新的逻辑尾è¿ä»£å™¨ä¸�å®�é™…åˆ é™¤å…ƒç´ éœ€é…�å�ˆerase。remove_if(begin, end, predicate)移动满足谓è¯�çš„å…ƒç´ åˆ°æœ«å°¾ã€‚vectorint nums {1, 2, 3, 2, 4}; // é€»è¾‘åˆ é™¤æ‰€æœ‰2移动到末尾 auto new_end remove(nums.begin(), nums.end(),
; // nums: [1,3,4,2,2] // 物ç�†åˆ 除真æ£ç§»é™¤å…ƒç´ nums.erase(new_end, nums.end()); // nums: [1,3,4] // 结å�ˆlambdaåˆ é™¤å�¶æ•° nums {1, 2, 3, 4, 5}; nums.erase(remove_if(nums.begin(), nums.end(), [](int x) { return x % 2 0; }), nums.end()); // nums: [1,3,5]
5 unique移除范围内è¿�ç»çš„é‡�å¤�å…ƒç´ è¿”å›�新的逻辑结尾è¿ä»£å™¨ã€‚通常ä¸�erase结å�ˆä½¿ç”¨ã€‚std::vectorint vec {1, 1, 2, 2, 3, 3, 3, 4, 5}; auto last std::unique(vec.begin(), vec.end()); vec.erase(last, vec.end()); // vecå�˜ä¸º{1, 2, 3, 4, 5}
6 reverseå��è½¬èŒƒå›´å†…çš„å…ƒç´ é¡ºåº�std::vectorint vec {1, 2, 3, 4, 5}; std::reverse(vec.begin(), vec.end()); // vecå�˜ä¸º{5, 4, 3, 2, 1}
7 rotateæ—‹è½¬èŒƒå›´å†…çš„å…ƒç´ ä½¿ä¸é—´å…ƒç´ æˆ�ä¸ºæ–°çš„ç¬¬ä¸€ä¸ªå…ƒç´ std::vectorint vec {1, 2, 3, 4, 5}; std::rotate(vec.begin(), vec.begin() 2, vec.end()); // 以3为起点旋转vecå�˜ä¸º{3, 4, 5, 1, 2}
8 shuffleéš�机é‡�æ�’èŒƒå›´å†…çš„å…ƒç´ éœ€è¦�C11或更高版本#include random #include algorithm std::vectorint vec {1, 2, 3, 4, 5}; std::random_device rd; std::mt19937 g(rd()); std::shuffle(vec.begin(), vec.end(), g); // éš�机打乱vecä¸çš„å…ƒç´ 3ã€�æ�’åº�和相关算法
1 sortã€�stable_sort ä¸� partial_sortsort(begin, end)å¯¹å…ƒç´ è¿›è¡Œå¿«é€Ÿæ�’åº�ä¸�稳定平å�‡æ—¶é—´å¤�æ�‚度 O (n log n)。stable_sort(begin, end)稳定æ�’åº�相ç‰å…ƒç´ 相对ä½�ç½®ä¸�å�˜ã€‚partial_sort(begin, mid, end)部分æ�’åº�使[begin, mid)ä¸ºæ•´ä¸ªèŒƒå›´ä¸æœ€å°�çš„å…ƒç´ å¹¶æ�’åº�。std::vectorint vec {5, 3, 1, 4, 2}; std::sort(vec.begin(), vec.end()); // 默认å�‡åº�vecå�˜ä¸º{1, 2, 3, 4, 5} std::sort(vec.begin(), vec.end(), std::greaterint()); // é™�åº�vecå�˜ä¸º{5, 4, 3, 2, 1} std::sort(vec.begin(), vec.end(), [](int a, int b) { return a b; }); // å�‡åº�自定义比较 std::vectorstd::pairint, int vec ; std::stable_sort(vec.begin(), vec.end(), [](const auto a, const auto b) { return a.first b.first; // 按firstæ�’åº�ä¿�æŒ�相ç‰å…ƒç´ 的相对顺åº� }); std::vectorint vec {5, 3, 1, 4, 2, 6}; // 将最å°�çš„3ä¸ªå…ƒç´ æ”¾åœ¨å‰�é�¢å¹¶æ�’åº� std::partial_sort(vec.begin(), vec.begin() 3, vec.end()); // ç�°åœ¨vecå‰�ä¸‰ä¸ªå…ƒç´ æ˜¯1, 2, 3å��é�¢æ˜¯æœªæ�’åº�çš„4, 5,
6
2 nth_elementé‡�æ–°æ�’列范围使得指定ä½�ç½®çš„å…ƒç´ ç‰äº�æ�’åº�å��çš„å…ƒç´ å¹¶ä¸”å·¦è¾¹çš„å…ƒç´ éƒ½ä¸�大äº�它å�³è¾¹çš„å…ƒç´ éƒ½ä¸�å°�äº�它std::vectorint vec {5, 3, 1, 4, 2, 6}; // 找到第三å°�çš„å…ƒç´ ç´¢å¼•2 std::nth_element(vec.begin(), vec.begin() 2, vec.end()); // ç�°åœ¨vec[2]是3å®ƒå·¦è¾¹çš„å…ƒç´ 3å�³è¾¹çš„
3
3 binary_searchã€�lower_boundã€�upper_bound需在已æ�’åº�的容器上使用binary_search(begin, end, value)判æ–value是å�¦å˜åœ¨è¿”å›�bool。lower_bound(begin, end, value)è¿”å›�第一个ä¸�å°�äº�valueçš„å…ƒç´ è¿ä»£å™¨ã€‚upper_bound(begin, end, value)è¿”å›�第一个大äº�valueçš„å…ƒç´ è¿ä»£å™¨ã€‚vectorint sorted {1, 3, 3, 5, 7}; // 必须先æ�’åº� // 判æ–3是å�¦å˜åœ¨ bool exists binary_search(sorted.begin(), sorted.end(),
; // true // 查找第一个3çš„å…ƒç´ auto lb lower_bound(sorted.begin(), sorted.end(),
; cout lower_bound index: lb - sorted.begin() endl; // 输出1 // 查找第一个3çš„å…ƒç´ auto ub upper_bound(sorted.begin(), sorted.end(),
; cout upper_bound index: ub - sorted.begin() endl; // 输出
3
4 mergeå�ˆå¹¶ä¸¤ä¸ªå·²æ�’åº�的范围到新容器ä¿�æŒ�æ�’åº�vectorint a {1, 3, 5}; vectorint b {2, 4, 6}; vectorint merged(a.size() b.size()); // å�ˆå¹¶aå’Œbå�‡éœ€å·²æ�’åº� merge(a.begin(), a.end(), b.begin(), b.end(), merged.begin()); // merged: [1,2,3,4,5,6]4ã€�å †ç®—æ³•STLæ��ä¾›äº†å°†èŒƒå›´ä½œä¸ºå †æ�¥æ“�作的算法包括make_heap,push_heap,pop_heap,sort_heapç‰ã€‚std::vectorint vec {4, 1, 3, 2, 5}; std::make_heap(vec.begin(), vec.end()); // æ�„å»ºæœ€å¤§å †vecå�˜ä¸º{5, 4, 3, 2, 1} vec.push_back(
; std::push_heap(vec.begin(), vec.end()); // å°†æ–°å…ƒç´ åŠ å…¥å †vecå�˜ä¸º{6, 4, 5, 2, 1, 3} std::pop_heap(vec.begin(), vec.end()); // å°†æœ€å¤§å…ƒç´ ç§»åˆ°æœ«å°¾vecå�˜ä¸º{5, 4, 3, 2, 1, 6} int max_val vec.back(); // è�·å�–æœ€å¤§å…ƒç´ 6 vec.pop_back(); // ç§»é™¤æœ€å¤§å…ƒç´ std::sort_heap(vec.begin(), vec.end()); // å°†å †æ�’åº�为å�‡åº�åº�列vecå�˜ä¸º{1, 2, 3, 4, 5}5ã€�最å°�/最大值算法
1 min å’Œ maxè¿”å›�两个值或åˆ�始化列表ä¸çš„æœ€å°�/最大值int a 5, b 3; int min_val std::min(a, b); // 3 int max_val std::max(a, b); // 5 auto min_of_list std::min({4, 2, 8, 5, 1}); // 1 auto max_of_list std::max({4, 2, 8, 5, 1}); //
8
2 min_element å’Œ max_elementè¿”å›�范围内的最å°�/æœ€å¤§å…ƒç´ çš„è¿ä»£å™¨std::vectorint vec {3, 1, 4, 2, 5}; auto min_it std::min_element(vec.begin(), vec.end()); // 指å�‘1 auto max_it std::max_element(vec.begin(), vec.end()); // 指å�‘
5
3 minmax_element (C
å�Œæ—¶è¿”å›�范围内的最å°�å’Œæœ€å¤§å…ƒç´ çš„è¿ä»£å™¨std::vectorint vec {3, 1, 4, 2, 5}; auto minmax std::minmax_element(vec.begin(), vec.end()); // minmax.first指å�‘1minmax.second指å�‘56ã€�数值算法在numericä¸
1 accumulateè®¡ç®—èŒƒå›´å†…å…ƒç´ çš„ç´¯åŠ å’Œæˆ–è‡ªå®šä¹‰æ“�作#include numeric std::vectorint vec {1, 2, 3, 4, 5}; int sum std::accumulate(vec.begin(), vec.end(),
; // 和�始值为0结�为15 int product std::accumulate(vec.begin(), vec.end(), 1, std::multipliesint()); // 乘积�始值为1结�为
1
2 inner_product计算两个范围的内积或自定义�作std::vectorint a {1, 2, 3}; std::vectorint b {4, 5, 6}; int dot std::inner_product(a.begin(), a.end(), b.begin(),
; // 1*4 2*5 3*6
3
3 iota用è¿�ç»é€’å¢�的值填充范围std::vectorint vec(
; std::iota(vec.begin(), vec.end(),
; // 填充为10, 11, 12, 13,
1
4 partial_sum计算部分和将结æ�œå˜å‚¨åœ¨ç›®æ ‡èŒƒå›´å†…std::vectorint src {1, 2, 3, 4, 5}; std::vectorint dst(src.size()); std::partial_sum(src.begin(), src.end(), dst.begin()); // dstå�˜ä¸º{1, 3, 6, 10, 15}
5 adjacent_differenceè®¡ç®—ç›¸é‚»å…ƒç´ çš„å·®å€¼å°†ç»“æ�œå˜å‚¨åœ¨ç›®æ ‡èŒƒå›´å†…std::vectorint src {1, 2, 3, 4, 5}; std::vectorint dst(src.size()); std::adjacent_difference(src.begin(), src.end(), dst.begin()); // dstå�˜ä¸º{1, 1, 1, 1, 1}7ã€�å…¶ä»–
1 generate用生�函数填充范围std::vectorint vec(
; int n 0; std::generate(vec.begin(), vec.end(), [n]() { return n; }); // 填充为0, 1, 2, 3,
4