当前位置: 首页 > news >正文

C++标准库算法整理

目录

1、数值操作

1.1、std::accumulate

1.2、std::inner_product

1.3、std::partial_sum

1.4、std::exclusive_scan

1.5、std::inclusive_scan

1.6、std::reduce

2、相邻元素

2.1、std::adjacent_difference

2.2、std::adjacent_find

 2.3、std::unique

2.4、std::unique_copy

3、是否满足条件

3.1、std::all_of

3.2、std::any_of

3.3、std::none_of

4、二分查找

4.1、std::binary_search

4.2、std::bsearch

4.3、std::lower_bound

4.4、std::upper_bound

4.5、std::equal_range

5、限制范围

5.1、std::clamp

6、复制

6.1、std::copy

6.2、std::copy_if

6.3、std::copy_backward

6.4、std::copy_n

7、计数

7.1、std::count

7.2、std::count_if

8、比较

8.1、std::equal

8.2、std::lexicographical_compare

8.3、std::lexicographical_compare_three_way

9、填充元素

9.1、std::fill

9.2、std::fill_n

9.3、std::generate

9.4、std::generate_n

9.5、std::iota

10、查找、搜索

10.1、std::find

10.2、std::find_if

10.3、std::find_if_not

10.4、std::find_end

10.5、std::find_first_of

10.6、std::search

10.7、std::search_n

10.8、std::mismatch

11、集合操作

11.1、std::includes

11.2、std::set_difference

11.3、std::set_intersection

11.4、std::set_symmetric_difference

11.5、std::set_union

12、合并

12.1、std::inplace_merge

12.2、std::merge

13、堆

13.1、std::make_heap

13.2、std::is_heap

13.3、std::push_heap

13.4、std::pop_heap

13.5、std::sort_heap

13.6、std::is_heap_until

14、排列

14.1、std::is_permutation

14.2、std::next_permutation

14.3、std::prev_permutation

15、最值

15.1、std::max 、std::min

15.2、std::max_element、std::min_element

15.3、std::minmax

15.4、std::minmax_element

16、移动元素

16.1、std::move

16.2、std::move_backward

17、排序

17.1、不完全排序

17.1.1、std::nth_element

17.2、部分排序

17.2.1、std::partial_sort

17.2.2、std::partial_sort_copy

17.3、快速排序

17.3.1、std::qsort

17.3.2、std::sort

17.4、稳定排序

17.4.1、std::stable_sort

17.5、判断是否有序

17.5.1、std::is_sorted

17.6、最长有序子序列

17.6.1、std::is_sorted_until

18、按条件划分

18.1、std::stable_partition

18.2、std::partition

18.3、std::partition_copy

18.4、std::partition_point

18.5、std::is_partitioned

19、移除

19.1、std::remove

63.2、std::remove_if

63.3、std::remove_copy

63.4、std::remove_copy_if

20、替换

20.1、std::replace

20.2、std::replace_if

20.3、std::replace_copy

20.4、std::replace_copy_if

21、反转元素

21.1、std::reverse

21.2、std::reverse_copy

22、循环右移

22.1、std::rotate

22.2、std::rotate_copy

23、随机操作

23、随机采样

23.1.1、std::sample

23.2、随机重排

23.2.1、std::shuffle

24、交换

24.1、std::swap

24.2、std::swap_ranges

24.3、std::iter_swap

25、对每个元素应用指定操作

25.1、for_each

25.1.1、std::for_each

25.1.2、std::for_each_n

25.2、transform

25.2.1、std::transform

25.2.2、std::transform_exclusive_scan

25.2.3、std::transform_inclusive_scan

25.2.4、std::transform_reduce

26、算法执行策略

27、策略控制器


1、数值操作

1.1、std::accumulate

元素累加。

1.2、std::inner_product

计算两个范围的内积。

1.3、std::partial_sum

累加求和。

1.4、std::exclusive_scan

序列的累计运算。此函数接受一个范围的输入序列,并将计算结果存储到另一个容器中。它通过对每个元素应用一个二元操作符,将当前元素与其前面的所有元素进行计算,并将计算结果累计到输出容器中。

int main(int argc, char *argv[])
{QVector<int> vec = {2,3,4,5,6};QVector<int> result(vec.size());//第一个元素就是初始值1, 从第二个开始依次乘以前面的数,最后一个元素不进行计算;前一次的结果会做为后一次的第一个参数std::exclusive_scan(vec.begin(), vec.end(), result.begin(), 1, [](int a,int b){return a * b;});qDebug() << result;//1 1*2 1*2*3 1*2*3*4 1*2*3*4*5
}

1.5、std::inclusive_scan

对一个序列中的元素进行累积操作。结果是计算出一个新的序列,新序列中的每个元素都是原序列中当前位置以及之前位置的元素的累积和。

#include <QVector>
#include <QtDebug>
#include <numeric>int main(int argc, char *argv[])
{QVector<int> numbers = {1, 2, 3, 4, 5};QVector<int> result(numbers.size());std::inclusive_scan(numbers.begin(), numbers.end(), result.begin());// 使用 qDebug 输出每个元素的累积和qDebug() << "累积和:";for (const auto& num : result) {qDebug() << num;}
}/*
累积和:
1
3
6
10
15
*/

1.6、std::reduce

在范围内进行归约操作,并返回结果。(将一系列的输入元素通过重复应用某个操作符将它们合并成一个简单的结果)它可以用于对一个范围内的元素进行求和、求积、最大值、最小值等操作。

//例1:求和QVector<int> numbers = {1, 2, 3, 4, 5};int sum = std::reduce(numbers.begin(), numbers.end(), 0);qDebug() << "Sum:" << sum;//例2:找到 QStringList 中最长的字符串QString longest = std::reduce(words.begin(), words.end(), QString(),[](const QString &current, const QString &next) {return current.length() > next.length() ? current : next;});//例3:将 QMap 的值相加int totalScore = std::reduce(scores.begin(), scores.end(), 0,[](int current, const QString &, int score) {return current + score;});

2、相邻元素

2.1、std::adjacent_difference

计算指定范围内的相邻元素的差值,并将结果存储到另一个范围中。

2.2、std::adjacent_find

在指定范围内查找相邻的重复元素,并返回第一个匹配的元素的迭代器。

 2.3、std::unique

移除指定范围内的连续重复元素,返回一个新的范围。

2.4、std::unique_copy

类似于 std::unique,但是它将移除的重复元素复制到另一个容器。

3、是否满足条件

3.1、std::all_of

判断指定范围内的所有元素是否都满足指定条件。

3.2、std::any_of

判断指定范围内的任意一个元素是否满足指定条件。

3.3、std::none_of

判断指定范围内的所有元素是否都不满足指定条件。

4、二分查找

在已排序范围内进行二分查找,判断指定的值是否存在。

4.2、std::bsearch

std::binary_search 功能相似,用于在 C 风格数组中进行二分查找。

int compare(const void* a, const void* b) {return (*(int*)a - *(int*)b);
}int main(int argc, char *argv[])
{int arr[] = {2, 5, 8, 12, 18, 23, 28, 32};int key = 18;int size = sizeof(arr) / sizeof(arr[0]);int* found = (int*)std::bsearch(&key, arr, size, sizeof(int), compare);if(found != nullptr) {qDebug() << "在数组中找到元素!"<<*found;} else {qDebug() << "在数组中未找到元素!";}return 0;
}//在数组中找到元素! 18

4.3、std::lower_bound

获取序列中大于等于某元素的第一个元素。

4.4、std::upper_bound

std::lower_bound类似。获取序列中大于某元素的第一个元素。

4.5、std::equal_range

在已排序范围内查找某个值的等值区间。

5、限制范围

5.1、std::clamp

将指定的值限制在给定的范围内,返回最接近的边界值。c++17以上才支持。

#include <algorithm>int main(int argc, char *argv[])
{int value = 20;int minValue = 5;int maxValue = 15;int clampedValue = std::clamp(value, minValue, maxValue);qDebug() << "范围限制后的值:" << clampedValue;return 0;
}

6、复制

6.1、std::copy

将指定范围内的元素复制到另一个范围中。

6.2、std::copy_if

将满足指定条件的元素从指定范围中复制到另一个范围中。

6.3、std::copy_backward

将指定范围内的元素逆向复制到另一个范围中。

6.4、std::copy_n

将指定数量的元素从指定范围复制到另一个范围中。

7、计数

7.1、std::count

计算指定范围内等于给定值的元素的个数。

7.2、std::count_if

计算指定范围内满足给定条件的元素的个数。

8、比较

8.1、std::equal

判断两个范围内的元素是否相等。

8.2、std::lexicographical_compare

按字典顺序比较两个范围。

8.3、std::lexicographical_compare_three_way

与std::lexicographical_compare类似,二者区别:

  • std::lexicographical_compare 比较两个范围的元素,并确定它们在字典序上的相对顺序。它返回一个布尔值,指示第一个范围是否在字典序上小于第二个范围。
  • std::lexicographical_compare_three_way 进行三路比较,比较两个范围的元素在字典序上的关系。它返回一个三路比较的结果,表示两个范围在字典序上的关系:小于、等于或大于。

9、填充元素

9.1、std::fill

用指定的值填充给定范围内的元素。

9.2、std::fill_n

用指定的值填充给定范围内的前 n 个元素。

9.3、std::generate

用生成器函数生成给定范围内的元素。

#include <QVector>
#include <algorithm>
#include <random>
#include <iostream>int main(int argc, char *argv[])
{QVector<int> numbers(10);  // 定义一个包含10个元素的向量std::random_device rd;  // 随机设备,用于生成随机数种子std::mt19937 gen(rd()); // 随机数引擎,用于生成随机数std::generate(numbers.begin(), numbers.end(), [&gen]() {return gen() % 100;  // 生成0-99的随机数});for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;
}

9.4、std::generate_n

用生成器函数生成给定范围内的前 n 个元素。

9.5、std::iota

用依次递增的值填充给定范围。

10、查找、搜索

10.1、std::find

查找指定值的元素。

10.2、std::find_if

查找满足特定条件的元素。

10.3、std::find_if_not

查找不满足特定条件的元素。

10.4、std::find_end

查找最后一次出现另一个范围的位置。

10.5、std::find_first_of

查找第一个与指定范围中的任何一个元素匹配的元素。

10.6、std::search

搜索一个子序列,并返回指向第一个匹配子序列的迭代器。

10.7、std::search_n

搜索连续出现指定数量的某个值,并返回指向这段连续值的迭代器。

10.8、std::mismatch

在两个范围中查找第一个不匹配的元素,并返回一个包含指向两个范围中不匹配元素的迭代器的 std::pair 对象。

int main(int argc, char *argv[])
{QVector<int> vec1 = {1, 2, 3, 4};QVector<int> vec2 = {1, 2, 5, 4, 6};auto result = std::mismatch(vec1.begin(), vec1.end(), vec2.begin());if (result.first != vec1.end() && result.second != vec2.end()) {qDebug() << "第一个不匹配的元素:";qDebug() << "vec1: " << *(result.first);qDebug() << "vec2: " << *(result.second);} else {qDebug() << "范围没有不匹配的元素";}
}

11、集合操作

11.1、std::includes

是否包含。

11.2、std::set_difference

差集。

11.3、std::set_intersection

交集。

11.4、std::set_symmetric_difference

对称差集。

11.5、std::set_union

并集。

12、合并

12.1、std::inplace_merge

一个序列中两个有序的子序列合并成一个有序的子序列。

12.2、std::merge

将两个已排序的范围合并为一个已排序的范围。

13、堆

堆是一个完全二叉树:堆中的所有层级都是完全填满的,最后一层可以部分填满,而且所有节点都尽可能靠左排列。

堆中每个节点的值都满足堆特性:即每个节点的值都大于或小于它的子节点(取决于堆是最大堆还是最小堆)。

根据堆特性的不同,堆可以分为两种类型:

  • 最大堆(Max Heap):在最大堆中,每个节点的值都大于或等于其子节点的值。因此,根节点是堆中的最大值。
  • 最小堆(Min Heap):在最小堆中,每个节点的值都小于或等于其子节点的值。因此,根节点是堆中的最小值。

13.1、std::make_heap

将一个范围转换为堆结构。

13.2、std::is_heap

判断给定范围内的元素是否满足堆的特性。

#include <QDebug>
#include <algorithm>
#include <QVector>int main(int argc, char *argv[])
{QVector<int> vec = {4, 7, 9, 10, 5, 8};// 检查整个容器是否满足堆的特性(默认为最大堆)bool isHeap = std::is_heap(vec.begin(), vec.end());qDebug() << "Is heap:" << (isHeap ? "true" : "false");std::make_heap(vec.begin(), vec.end()); // 将容器转换为堆// 再次检查整个容器是否满足堆的特性isHeap = std::is_heap(vec.begin(), vec.end());qDebug() << "Is heap:" << (isHeap ? "true" : "false");qDebug() << vec;
}

13.3、std::push_heap

将指定范围内的元素插入到容器中,并调整剩余元素的顺序,使其符合堆的规则。

13.4、std::pop_heap

将容器中的最大元素移动到末尾,并调整剩余元素的顺序,使其符合堆的规则。

#include <QDebug>
#include <algorithm>
#include <QVector>int main(int argc, char *argv[])
{QVector<int> numbers = {4, 2, 8, 5, 1, 7};// 将容器转换为堆std::make_heap(numbers.begin(), numbers.end());// 插入新元素并调整堆结构numbers.push_back(3);std::push_heap(numbers.begin(), numbers.end());qDebug() << "堆排序前: " << numbers;// 弹出堆顶元素(最大值)std::pop_heap(numbers.begin(), numbers.end());int max = numbers.back();numbers.pop_back();qDebug() << "弹出的最大值: " << max;qDebug() << "堆排序后: " << numbers;
}

13.5、std::sort_heap

将堆范围转换为有序范围。

    QVector<int> vec = {9, 4, 6, 2, 1, 8, 5};std::make_heap(vec.begin(), vec.end()); // 创建一个最大堆qDebug() << "最大堆初始状态:"<<vec;std::sort_heap(vec.begin(), vec.end()); // 使用 sort_heap 进行堆排序qDebug() << "堆排序后的数组:"<<vec;

13.6、std::is_heap_until

确定范围内的元素是否构成堆,并返回指向不满足堆属性的第一个元素的迭代器。

    QVector<int> vec = {9, 4, 6, 2, 1, 8, 5};auto iter = std::is_heap_until(vec.begin(), vec.end());if (iter != vec.end()) {int index = std::distance(vec.begin(), iter);qDebug() << "不满足堆属性的元素位置:" << index;} else {qDebug() << "整个范围满足堆属性";}

第5个元素8不满足小于其父节点6的要求。

14、排列

14.1、std::is_permutation

检查序列是否是另一序列的排列。

14.2、std::next_permutation

重新排列范围内的元素,返回按照字典序排列的下一个值较大的组合。

14.3、std::prev_permutation

和std::next_permutation类似不过每次返回按字典序排序的相对当前序列较小的值。

15、最值

15.1、std::max 、std::min

返回两个值中较大、较小者。

15.2、std::max_element、std::min_element

查找最大值、最小值的位置。

15.3、std::minmax

查找最小和最大元素,返回一个包含最小和最大元素的 std::pair 对象。

15.4、std::minmax_element

同时找到给定范围内的最小和最大元素,返回一个包含指向最小和最大元素的迭代器的 std::pair 对象。

    std::vector<int> vec = {4, 2, 1, 5, 3};auto result = std::minmax_element(vec.begin(), vec.end());auto minIter = result.first;auto maxIter = result.second;std::cout << "最小元素: " << *minIter << std::endl;std::cout << "最大元素: " << *maxIter << std::endl;

16、移动元素

16.1、std::move

将指定范围内的元素转移到另一个位置。

#define debug qDebug()<<
int main(int argc, char *argv[])
{QVector<QString> vec;for (int i = 0; i < 5; ++i){vec.append(QString("xx%1").arg(i));  // 向 QVector 中添加元素}vec.resize(10);  // 调整 QVector 的大小为 10debug  "vec:" << vec;  // 输出 QVector 初始状态std::move(vec.begin(), vec.begin() + 2, vec.end() - 2);  // 使用 std::move 移动元素debug "vec:" << vec;  // 输出移动后的 QVector
}

16.2、std::move_backward

与 std::move 类似,但是它以反向顺序进行移动。用于将元素的值从一个范围内的位置移动到另一个范围内的位置,并保持原始顺序的逆序。

#define debug qDebug()<<
int main(int argc, char *argv[])
{QList<int> sourceVec = {1, 2, 3, 4, 5};QList<int> destVec;destVec.reserve(5); // 预分配内存空间for (int i = 0; i < 5; ++i){destVec.append(0); // 在列表末尾添加元素}debug destVec;std::move_backward(sourceVec.begin(), sourceVec.end()-1, destVec.end());debug sourceVec;debug destVec;return 0;
}

17、排序

17.1、不完全排序

17.1.1、std::nth_element

不完全排序。

17.2、部分排序

17.2.1、std::partial_sort

部分排序,使得排序后的前一部分元素符合特定的顺序。

17.2.2、std::partial_sort_copy

部分排序,并将排序结果复制到另一个容器中。

17.3、快速排序

17.3.1、std::qsort

对给定范围内的元素进行快速排序。参数为数组。

17.3.2、std::sort

对指定范围内的元素进行排序。

#include <iostream>
#include <vector>
#include <algorithm>bool compare(int a, int b) {return a > b;  // 降序排序
}int main() {std::vector<int> nums = {5, 2, 8, 3, 1};// 对容器中的元素进行降序排序std::sort(nums.begin(), nums.end(), compare);// 输出结果for (const auto& num : nums) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

17.4、稳定排序

17.4.1、std::stable_sort

对指定范围内的元素进行稳定排序。

17.5、判断是否有序

17.5.1、std::is_sorted

判断序列是否有序。

17.6、最长有序子序列

17.6.1、std::is_sorted_until

查找初始最长有序子序列。

18、按条件划分

18.1、std::stable_partition

将满足条件的元素放到前面,不满足条件的元素放到后面。

18.2、std::partition

stable_partition类似,但不会保证结果序列在原来序列的相对顺序,并返回一个指向满足条件的最后一个元素的迭代器。

18.3、std::partition_copy

类似于 std::partition,但是将满足条件和不满足条件的元素分别复制到两个不同的容器中。

18.4、std::partition_point

在已划分的有序区间中查找第一个不满足某个条件的元素。

18.5、std::is_partitioned

检查一个范围是否被划分为满足指定条件的元素和不满足指定条件的元素两个部分。

19、移除

19.1、std::remove

移除指定范围内的元素,返回一个新的范围,其中被移除的元素被放置在范围的末尾。但此函数并不是真正地删除元素,而是将元素移动到范围尾部并返回新的范围。

63.2、std::remove_if

与 std::remove 类似,但是它可以使用一个谓词来决定是否要移除元素。

63.3、std::remove_copy

类似于 std::remove,但是它将移除的元素复制到另一个容器。

63.4、std::remove_copy_if

类似于 std::remove_if,它将移除元素的副本复制到另一个容器。

20、替换

20.1、std::replace

用指定的新值替换给定范围内的所有旧值。

20.2、std::replace_if

类似于 std::replace,但是它可以使用一个谓词来决定是否要替换值。

20.3、std::replace_copy

类似于 std::replace,但是它将替换的副本复制到另一个容器。

20.4、std::replace_copy_if

类似于 std::replace_if,它将替换元素的副本复制到另一个容器。

21、反转元素

21.1、std::reverse

反转给定范围内的元素顺序。

21.2、std::reverse_copy

类似于 std::reverse,但是它将反转的副本复制到另一个容器。

22、循环右移

22.1、std::rotate

将给定范围内的元素循环右移。

22.2、std::rotate_copy

类似于 std::rotate,但是它将循环右移的副本复制到另一个容器。

23、随机操作

23、随机采样

23.1.1、std::sample

从指定的范围中随机选择一定数量的元素,并将选中的元素存储到另一个容器中。

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>int main(int argc, char *argv[])
{QVector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};QVector<int> sampledNumbers(5); // 存储抽样结果的容器// 随机数引擎和分布器std::random_device rd;std::mt19937 gen(rd());// 执行抽样std::sample(numbers.begin(), numbers.end(), sampledNumbers.begin(), 5, gen);// 输出抽样结果qDebug() << "Sampled numbers:"<<sampledNumbers;
}

23.2、随机重排

23.2.1、std::shuffle

随机重新排列给定范围内的元素,可以指定自定义的随机数引擎。

24、交换

24.1、std::swap

std::swap 函数是一个通用的交换函数,可以用于交换绝大多数类型的对象。它的实现会通过移动语义或拷贝语义来保证高效的值交换。类的交换函数。

24.2、std::swap_ranges

交换两个范围内的元素。

24.3、std::iter_swap

交换两个迭代器指向的元素。

25、对每个元素应用指定操作

25.1、for_each

25.1.1、std::for_each

对给定范围内的每个元素应用指定的操作。

25.1.2、std::for_each_n

对给定范围内的前 n 个元素应用指定的操作。

#include <iostream>
#include <algorithm>int main()
{int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int count = 5;std::for_each_n(numbers, count, [](int number) {std::cout << number << std::endl;});return 0;
}

25.2、transform

25.2.1、std::transform

对指定范围内的元素应用一个函数进行处理,并将结果存储到另一个容器中。

25.2.2、std::transform_exclusive_scan

这个各种资料的解释让人越看越糊涂,直接看代码:

int main(int argc, char *argv[])
{QVector<int> input = {1, 2, 3, 4, 5};QVector<int> output(input.size());// 定义一个二元操作函数,用于将相邻元素相加auto binary_op = [](int a, int b) {return a + b;};// 定义一个一元操作函数,用于将元素加倍auto unary_op = [](int a) {return a * 2;};std::transform_exclusive_scan(input.begin(), input.end(), output.begin(),0, binary_op, unary_op);// 使用 qDebug 输出结果qDebug() << "转换和前缀扫描的结果:"<<output;
}

即进行了两步:

1、unary_op作用于每个元素后,

2、用binary_op累积(什么是累积可查看上面std::inclusive_scan的说明)操作新元素(不含当前值)。

即:{1, 2, 3, 4, 5}    ->    {2, 4, 6, 8, 10}    ->    {0, 2, 6(即2+4), 12(2+4+6),20(即2+4+6+8)}

参数4是初始值:

25.2.3、std::transform_inclusive_scan

与std::transform_exclusive_scan类似的,不同之处在于不能设置初始值和累积时包括当前值。

25.2.4、std::transform_reduce

可以对指定范围内的元素进行变换,并将结果归约为单个值。

归约”是指将一个序列中的元素经过某种操作(例如相加、相乘等),最后得到一个单独的结果。

int main(int argc, char *argv[])
{// 创建一个包含整数的 Qt 容器QVector<int> nums = {1, 2, 3, 4, 5};// 定义一个变换函数对象,将元素的平方返回auto square = [](int num) { return num * num; };auto plus = [](int a, int b) { return a + b; };// 使用自定义的归约函数对象对容器中的元素进行变换和归约操作int sumOfSquares = std::transform_reduce(nums.begin(), nums.end(), 0,plus,square); // 输出结果qDebug() << "容器元素的平方和:" << sumOfSquares; //55
}

此代码首先对{1, 2, 3, 4, 5}的每个元素执行square即平方操作,得到{1, 4, 9, 16, 25},再对此序列中的元素执行plus即相加的操作。

26、算法执行策略

  • std::execution::seq:顺序执行,即算法按照顺序运行,不进行并行化。
  • std::execution::par:并行执行,即算法可以并行化运行,以提高性能。
  • std::execution::par_unseq:并行且无序执行,即算法可以并行化运行,并且运行结果无序。
  • std::execution::unseq:无序执行,即算法可以进行优化,包括并行化和指令重排。

用法示例:

#include <execution>int main(int argc, char *argv[])
{std::vector<int> vec = {1, 2, 3, 4, 5};// 使用并行执行策略对向量中的每个元素进行平方操作std::for_each(std::execution::par, vec.begin(), vec.end(),[](int& num) { num = num * num; });// 输出结果for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;
}

27、策略控制器

  • std::execution::sequenced_policy:算法应该以顺序的方式执行,即算法在一个线程中按照顺序依次执行,不会并行化或无序化操作。这种策略保证了算法的结果与输入的迭代器顺序保持一致。
  • std::execution::parallel_policy:算法应该以并行的方式执行,即算法会尽可能地在多个线程中并行执行,以提高执行效率。并行执行策略充分利用多核处理器的能力,并允许多个线程同时处理不相关的任务。

用法示例:

#include <algorithm>
#include <execution>
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用并行执行策略对向量中的每个元素进行输出std::for_each(std::execution::parallel_policy, vec.begin(), vec.end(),[](int num) {std::cout << num << " ";});std::cout << std::endl;return 0;
}

相关文章:

C++标准库算法整理

目录 1、数值操作 1.1、std::accumulate 1.2、std::inner_product 1.3、std::partial_sum 1.4、std::exclusive_scan 1.5、std::inclusive_scan 1.6、std::reduce 2、相邻元素 2.1、std::adjacent_difference 2.2、std::adjacent_find 2.3、std::unique 2.4、std::u…...

【Codeforces】Codeforces Round 903 (Div. 3)【待补】

Dashboard - Codeforces Round 903 (Div. 3) - Codeforces Problem - C - Codeforces Problem - D - Codeforces...

workerman 运行时报错 Call to undefined function posix_getpid()

使用 验证php扩展是否齐全 curl -Ss https://www.workerman.net/check | php缺少posix 下载 在 Linux 系统上&#xff0c;可以使用包管理器来安装 php-posix 扩展&#xff0c;例如 Ubuntu 系统可以通过以下命令进行安装&#xff1a; sudo apt-get install php-posix如果你使用…...

【探讨C++中的临时对象:一时之物还是永恒之道?】

在C编程中&#xff0c;临时对象是一个经常引起讨论的话题。它们是什么&#xff0c;为什么它们存在&#xff0c;以及如何正确使用它们&#xff1f;本文将深入探讨C中的临时对象&#xff0c;帮助您理解它们的含义和用途。 什么是临时对象&#xff1f; 临时对象&#xff08;Temp…...

二叉树相关算法

1、二叉树基本操作 二叉树的定义就不在这里多说了&#xff0c;下面这个图就是一个简单的二叉树&#xff1a; 二叉树的三种遍历方式&#xff1a; 前序遍历&#xff1a;头左右&#xff0c;也就是先头后左再右&#xff1a;1245367 public static void prePrint(BinaryTreeNode …...

Vue_Bug npm install报错 code:128

Bug描述&#xff1a; npm install报错 code&#xff1a;128 npm ERR! Warning: Permanently added ‘github.com’ (ED25519) to the list of known hosts. npm ERR! gitgithub.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote repository. n…...

【Unity ShaderGraph】| 如何快速制作一个 马赛克效果 实战

前言 【Unity ShaderGraph】| 如何快速制作一个 马赛克效果 实战一、效果展示二、马赛克效果四、应用实例 前言 本文将使用Unity 的ShaderGraph制作一个马赛克的效果&#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【Unity S…...

【Java 进阶篇】JavaScript DOM Document对象详解

在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;扮演着重要的角色。它允许我们使用JavaScript来与网页文档进行交互&#xff0c;实现动态的网页效果。DOM的核心部分之一就是Document对象&#xff0c;它代表了整个HTML文档。在本篇博客中&#xff0c;我们将深…...

LetCode刷题[简单题](5)按摩师,迭代出最优解(卡尔曼滤波也是类似迭代)

所有的遍历寻求有条件约束的最大值都可以转换成&#xff0c;新的数带来的最大值的变化&#xff0c;问题往这个方向转化就可以&#xff0c;问题都是在最中进行选择的&#xff0c;因此关注的问题最大值得上限就好了&#xff0c;不必关注可能随机的下限。关注随机可能的下限会把问…...

C/C++笔试易错与高频题型图解知识点(二)—— C++部分(持续更新中)

目录 1.构造函数初始化列表 1.1 构造函数初始化列表与函数体内初始化区别 1.2 必须在初始化列表初始化的成员 2 引用&引用与指针的区别 2.1 引用初始化以后不能被改变&#xff0c;指针可以改变所指的对象 2.2 引用和指针的区别 3 构造函数与析构函数系列题 3.1构造函数与析…...

使用new创建动态结构

在运行时创建数组优于在编译时创建数组&#xff0c;对于结构&#xff08;同一个结构可以存储多种类型的数据。&#xff09;也是如此。需要在程序运行时为结构分配所需的空间&#xff0c;这也可以使用new运算符来完成。通过使用new&#xff0c;可以创建动态结构。同样&#xff0…...

论文笔记与复现[156]PARAFAC. tutorial and applications

原文下载&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0169743997000324 摘要 本文介绍了PARAFAC的多维分解方法及其在化学计量学中的应用。PARAFAC是PCA向高阶数组的推广&#xff0c;但该方法的一些特性与普通的二维情况截然不同。例如&#xff0c;…...

Python 基础30道测试题

你好&#xff0c;我是悦创。 我会给出 30 道涉及 Python 基础的题目。这些题目将覆盖各种 Python 基础知识点&#xff0c;包括数据类型、控制结构、函数、模块等。 输出 “Hello, World!”。创建一个变量&#xff0c;并为其赋值&#xff0c;然后输出该变量的值。输入两个数&a…...

【环境搭建】linux docker-compose安装rocketmq

创建目录 mkdir -p /data/docker/rocketmq/namesrv/logs mkdir -p /data/docker/rocketmq/broker1/conf mkdir -p /data/docker/rocketmq/broker1/logs mkdir -p /data/docker/rocketmq/broker1/store 给权限 chmod -R 777 /data/docker/rocketmq 创建配置文件 cd /data/d…...

python:使用卷积神经网络(CNN)进行回归预测

作者:CSDN @ _养乐多_ 本文详细记录了从Excel或者csv中读取用于训练卷积神经网络(CNN)模型的数据,包括多个自变量和1个因变量数据,以供卷积神经网络模型的训练。随后,我们将测试数据集应用于该CNN模型,进行回归预测和分析。 该代码进一步修改可用于遥感影像回归模型. …...

数据结构----算法--五大基本算法

数据结构----算法–五大基本算法 一.贪心算法 1.什么是贪心算法 在有多个选择的时候不考虑长远的情况&#xff0c;只考虑眼前的这一步&#xff0c;在眼前这一步选择当前的最好的方案 二.分治法 1.分治的概念 分治法&#xff1a;分而治之 将一个问题拆解成若干个解决方式…...

网格大师如何把b3dm转为osgb格式?

答&#xff1a;在网格大师的倾斜数据处理工具中选中“3DTiles转OSGB”&#xff0c;设定数据输入路径和输出路径提交任务即可。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c;集格式转换、坐标转…...

基于深度优先搜索的图遍历

这里写目录标题 基于深度优先搜索的无向图遍历算法流程图Python实现Java实现 基于深度优先搜索的有向图遍历Python实现 基于深度优先搜索的无向图遍历 使用深度优先搜索遍历无向图&#xff0c;将无向图用邻接表存储&#xff1a; 算法流程图 初始化起点 source&#xff0c;当…...

Web3D虚拟人制作简明指南

如何在线创建虚拟人? 虚拟人,也称为数字化身、虚拟助理或虚拟代理,是一种可以通过各种在线平台与用户进行逼真交互的人工智能人。 在线创建虚拟人变得越来越流行,因为它为个人和企业带来了许多好处。 通过虚拟助理或代理,您可以以更具吸引力和个性化的方式与客户或受众进…...

【大数据 - Doris 实践】数据表的基本使用(一):基本概念、创建表

数据表的基本使用&#xff08;一&#xff09;&#xff1a;基本概念、创建表 1.创建用户和数据库2.Doris 中数据表的基本概念2.1 Row & Column2.2 Partition & Tablet 3.建表实操3.1 建表语法3.2 字段类型3.3 创建表3.3.1 Range Partition3.3.2 List Partition 1.创建用…...

剑指Offer || 038.每日温度

题目 请根据每日 气温 列表 temperatures &#xff0c;重新生成一个列表&#xff0c;要求其对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输入: temperatures…...

URL because the SSL module is not available

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(“Can’t connect to HTT PS URL because the…...

excel 日期与时间戳的相互转换

1、日期转时间戳&#xff1a;B1INT((A1-70*365-19)*86400-8*3600)*1000 2、时间戳转日期&#xff1a;A1TEXT((B1/10008*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss") 以上为精确到毫秒&#xff0c;只精确到秒不需要乘或除1000。 使用以上方法可以进行excel中日期…...

MongoDB中的嵌套List操作

前言 MongoDB区别Mysql的地方&#xff0c;就是MongoDB支持文档嵌套&#xff0c;比如最近业务中就有一个在音频转写结果中进行对话场景&#xff0c;一个音频中对应多轮对话&#xff0c;这些音频数据和对话信息就存储在MongoDB中文档中。集合结构大致如下 {"_id":234…...

【C#】什么是并发,C#常规解决高并发的基本方法

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 在实际项目开发中&#xff0c;多少都会遇到高并发的情况&#xff0c;有可能是网络问题&#xff0c;连续点击鼠标无反应快速发起了N多次调用接口&#xff0c; 导致极短时间内重复调用了多次…...

MySQL双主一从高可用

MySQL双主一从高可用 文章目录 MySQL双主一从高可用环境说明1.配置前的准备工作2.配置yum源 1.在部署NFS服务2.安装主数据库的数据库服务&#xff0c;并挂载nfs3.初始化数据库4.配置两台master主机数据库5.配置m1和m2成为主数据库6.安装、配置keepalived7.安装部署从数据库8.测…...

#力扣:2894. 分类求和并作差@FDDLC

2894. 分类求和并作差 - 力扣&#xff08;LeetCode&#xff09; 一、Java class Solution {public int differenceOfSums(int n, int m) {return (1n)*n/2-n/m*(mn/m*m)/2;} } 二、C class Solution { public:int differenceOfSums(int n, int m) {return (1n)*n/2-n/m*(mn…...

【网络协议】聊聊从物理层到MAC层 ARP 交换机

物理层 物理层其实就是电脑、交换器、路由器、光纤等。组成一个局域网的方式可以使用集线器。可以将多台电脑连接起来&#xff0c;然后进行将数据转发给别的端口。 数据链路层 Hub其实就是广播模式&#xff0c;如果A电脑发出一个包&#xff0c;B、C电脑也可以收到。那么数据…...

WordPress插件 WP-PostViews 汉化语言包

WP-PostViews汉化语言包 WP-PostViews是一款很受欢迎的文章浏览次数统计插件&#xff0c;记录每篇文章展示次数、根据展示次数显示历史最热或最衰的文章排行、展示范围可以是全部文章和页面&#xff0c;也可以是某些目录下的文章和页面。本文还介绍了一些隐藏的功能&#xff0…...

基础课2——自然语言处理

1.概念 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 自然语言处理的主要研究方向包括&#xff1a; 语言学研究&…...