C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- std::execution::sequenced_policy, std::execution::parallel_policy, std::execution::parallel_unsequenced_policy, std::execution::unsequenced_policy
- æå¶çº¦ç®æ³ (C++20 èµ·)
- std::is_execution_policy
- std::execution::seq, std::execution::par, std::execution::par_unseq, std::execution::unseq
- std::all_of, std::any_of, std::none_of
- std::for_each_n
- std::sort
- std::reduce
- std::inclusive_scan
- std::exclusive_scan
- std::random_shuffle, std::shuffle
- std::clamp
- std::equal
- std::is_permutation
- std::mismatch
- std::swap
- std::search
- std::transform
- std::for_each
- std::make_heap
- std::count, std::count_if
- std::adjacent_find
- std::find, std::find_if, std::find_if_not
- std::find_end
- std::find_first_of
- std::search_n
- std::lexicographical_compare
- std::lexicographical_compare_three_way
- std::copy, std::copy_if
- std::copy_n
- std::copy_backward
- std::move
- std::move_backward
- std::shift_left, std::shift_right
- std::fill
- std::fill_n
- std::generate
- std::generate_n
- std::iter_swap
- std::swap_ranges
- std::sample
- std::remove, std::remove_if
- std::replace, std::replace_if
- std::reverse
- std::rotate
- std::unique
- std::remove_copy, std::remove_copy_if
- std::replace_copy, std::replace_copy_if
- std::reverse_copy
- std::rotate_copy
- std::unique_copy
- std::is_partitioned
- std::partition_point
- std::partition
- std::partition_copy
- std::stable_partition
- std::is_sorted
- std::is_sorted_until
- std::stable_sort
- std::partial_sort
- std::partial_sort_copy
- std::nth_element
- std::lower_bound
- std::upper_bound
- std::binary_search
- std::equal_range
- std::merge
- std::inplace_merge
- std::set_difference
- std::set_intersection
- std::set_symmetric_difference
- std::set_union
- std::includes
- std::is_heap
- std::is_heap_until
- std::sort_heap
- std::push_heap
- std::pop_heap
- std::max
- std::max_element
- std::min
- std::min_element
- std::minmax
- std::minmax_element
- std::next_permutation
- std::prev_permutation
- std::iota
- std::inner_product
- std::adjacent_difference
- std::accumulate
- std::transform_reduce
- std::partial_sum
- std::transform_inclusive_scan
- std::transform_exclusive_scan
- std::qsort
- std::bsearch
- 注é
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >ç®æ³åº > std::merge
std::merge
OutputIt merge( InputIt1 first1, InputIt1 last1,
        InputIt2 first2, InputIt2 last2,
constexpr OutputIt merge( InputIt1 first1, InputIt1 last1,
             InputIt2 first2, InputIt2 last2,
ForwardIt3 merge( ExecutionPolicy&& policy,
         ForwardIt1 first1, ForwardIt1 last1,
         ForwardIt2 first2, ForwardIt2 last2,
OutputIt merge( InputIt1 first1, InputIt1 last1,
        InputIt2 first2, InputIt2 last2,
constexpr OutputIt merge( InputIt1 first1, InputIt1 last1,
             InputIt2 first2, InputIt2 last2,
ForwardIt3 merge( ExecutionPolicy&& policy,
         ForwardIt1 first1, ForwardIt1 last1,
         ForwardIt2 first2, ForwardIt2 last2,
å½å¹¶äºä¸ªå·²æåºèå´ [first1, last1) å [first2, last2) å°å§äº d_first çä¸ä¸ªå·²æåºèå´ä¸ã
operator< æ¯è¾å
ç´ ãcomp æ¯è¾å
ç´ ãpolicy æ§è¡ãè¿äºéè½½ä»
è¥ std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 为 true æåä¸éè½½å³è®®ã对äºå èå´ä¸ççä»·å ç´ ï¼æ¥èªç¬¬ä¸èå´çå ç´ ï¼ä¿æå ¶å顺åºï¼å äºæ¥èªç¬¬äºèå´çå ç´ ï¼ä¿æå ¶å顺åºï¼ã
è¥ç®æ èå´ä¸è¾å ¥èå´ä¹ä¸éå ï¼åè¡ä¸ºæªå®ä¹ï¼è¾å ¥èå´å¯ç¸äºéå ï¼ã
åæ°
| first1, last1 | - | è¦å½å¹¶çå ç´ ç第ä¸èå´ |
| first2, last2 | - | è¦å½å¹¶å°å ç´ ç第äºèå´ |
| d_first | - | ç®æ èå´çèµ·å§ |
| policy | - | æç¨çæ§è¡çç¥ãç»èè§æ§è¡çç¥ã |
| comp | - | æ¯è¾å½æ°å¯¹è±¡ï¼å³æ»¡è¶³æ¯è¾ (Compare) æ¦å¿µç对象ï¼ï¼è¥ç¬¬ä¸åæ°å°äºï¼å³å
åºäºï¼ç¬¬äºåæ°åè¿å âtrue ã æ¯è¾å½æ°çç¾ååºçä»·äºå¦ä¸ï¼  bool cmp(const Type1 &a, const Type2 &b); è½ç¶ç¾åä¸å¿
æ const & ï¼å½æ°ä¹ä¸è½ä¿®æ¹ä¼ éç»å®ç对象ï¼èä¸å¿
é¡»æ¥åï¼å¯ä¸º const çï¼ç±»å |
| ç±»åè¦æ± | ||
-InputIt1, InputIt2 å¿
须满足éçè¾å
¥è¿ä»£å¨ (LegacyInputIterator) çè¦æ±ã
| ||
-ForwardIt1, ForwardIt2, ForwardIt3 å¿
须满足éçååè¿ä»£å¨ (LegacyForwardIterator) çè¦æ±ã
| ||
-OutputIt å¿
须满足éçè¾åºè¿ä»£å¨ (LegacyOutputIterator) çè¦æ±ã
| ||
è¿åå¼
æåæåå¤å¶å ç´ åä¸å ç´ çè¿ä»£å¨ã
å¤æåº¦
å¼å¸¸
æ¥æå为 ExecutionPolicy çæ¨¡æ¿å½¢åçéè½½æä¸åæ¹å¼æ¥åé误ï¼
- è¥ä½ä¸ºç®æ³ä¸é¨åè°ç¨ç彿°çæ§è¡æåºå¼å¸¸ï¼ä¸
ExecutionPolicy为æ åçç¥ä¹ä¸ï¼åè°ç¨ std::terminate ã对äºä»»ä½å ¶ä»ExecutionPolicyï¼è¡ä¸ºæ¯å®ç°å®ä¹çã - è¥ç®æ³æ æ³åé å åï¼åæåº std::bad_alloc ã
注æ
æ¤ç®æ³è¿è¡ç±»ä¼¼ std::set_union æåçä»»å¡ã齿¶èäºä¸ªå·²æåºè¾å
¥èå´ï¼å¹¶äº§çæ¥ææ¥èªä¸¤ä¸ªè¾å
¥çå
ç´ çè¾åºãæ¤äºç®æ³çåºå«å¨äºå¤çæ¥èªäºä¸ªè¾å
¥çæ¯è¾çä»·ï¼è§å¯å°äºæ¯è¾ (LessThanComparable) ä¸ç注æï¼çå¼ãè¥ä»»ä½çä»·çå¼å¨ç¬¬ä¸èå´åºç° n 次ï¼å¨ç¬¬äºèå´åºç° m 次ï¼å std::merge ä¼è¾åºææ n+m 次åºç°ï¼è std::set_union å°åªè¾åº std::max(n, m) 次ãæ
std::merge åç¡®è¾åº std::distance(first1, last1) + std::distance(first2, last2) 个å¼ï¼è std::set_union å¯è½äº§ç徿´å°ã
å¯è½çå®ç°
| çæ¬ä¸ |
|---|
template<class InputIt1, class InputIt2, class OutputIt> OutputIt merge(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first) { for (; first1 != last1; ++d_first) { if (first2 == last2) { return std::copy(first1, last1, d_first); } if (*first2 < *first1) { *d_first = *first2; ++first2; } else { *d_first = *first1; ++first1; } } return std::copy(first2, last2, d_first); } |
| çæ¬äº |
template<class InputIt1, class InputIt2, class OutputIt, class Compare> OutputIt merge(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, OutputIt d_first, Compare comp) { for (; first1 != last1; ++d_first) { if (first2 == last2) { return std::copy(first1, last1, d_first); } if (comp(*first2, *first1)) { *d_first = *first2; ++first2; } else { *d_first = *first1; ++first1; } } return std::copy(first2, last2, d_first); } |
示ä¾
#include <iostream> #include <iterator> #include <algorithm> #include <vector> #include <random> #include <functional>  int main() { // ä»¥éæºæ°å¡«å vector std::random_device rd; std::mt19937 mt(rd()); std::uniform_int_distribution<> dis(0, 9);  std::vector<int> v1(10), v2(10); std::generate(v1.begin(), v1.end(), std::bind(dis, std::ref(mt))); std::generate(v2.begin(), v2.end(), std::bind(dis, std::ref(mt)));  // æåº std::sort(v1.begin(), v1.end()); std::sort(v2.begin(), v2.end());  // è¾åº v1 std::cout << "v1 : "; std::copy(v1.begin(), v1.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n';  // è¾åº v2 std::cout << "v2 : "; std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n';  // å½å¹¶ std::vector<int> dst; std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst));  // è¾åº std::cout << "dst: "; std::copy(dst.begin(), dst.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; }
å¯è½çè¾åºï¼
v1Â : 0 1 3 4 4 5 5 8 8 9 v2Â : 0 2 2 3 6 6 8 8 8 9 dst: 0 0 1 2 2 3 3 4 4 5 5 6 6 8 8 8 8 8 9 9
åé
| å°±å°å½å¹¶ä¸¤ä¸ªæåºèå´ (彿°æ¨¡æ¿) | |
| 计ç®ä¸¤ä¸ªéåçå¹¶é (彿°æ¨¡æ¿) | |
| å°èå´æååºæåº (彿°æ¨¡æ¿) | |
| å°èå´å
çå
ç´ æåºï¼åæ¶ä¿æç¸ççå
ç´ ä¹é´çé¡ºåº (彿°æ¨¡æ¿) |