📅  最后修改于: 2023-12-03 15:13:55.185000             🧑  作者: Mango
C++标准模板库(STL)提供了许多有用的算法,这些算法被称为STL算法。这些算法已经预先实现,可以被直接调用,而且效率和正确性都得到保证。使用STL算法,可以高效并且简洁地实现许多常见的操作。
STL-algorithm算法库包含了很多算法,例如排序、查找、变换、拷贝、合并等等。下面将介绍一些较为常用的算法。
sort是一个非常常用的排序算法。它可以对数据进行排序,从而使数据序列按照升序或者降序排列。sort函数有两个重载版本,分别是:
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
第一个版本采用默认的比较器进行排序,即升序排序。第二个版本可以手动指定一个比较器进行排序。例如,以下是一个将字符串按照长度从大到小排列的例子:
vector<string> strs({"apple", "orange", "banana", "melon", "grape"});
sort(strs.begin(), strs.end(), [](const string& a, const string& b){return a.size() > b.size();});
//输出结果: grape orange banana melon apple
find算法可以用于在序列中查找指定的元素,并返回该元素的迭代器。如果没有找到对应的元素,则返回一个表示末尾位置的迭代器。
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
例如,以下是一个查找元素的例子:
vector<int> nums({1,2,3,4,5});
auto it = find(nums.begin(), nums.end(), 3);
if (it != nums.end())
cout << "Find 3: " << *it << endl;
else
cout << "Not found." << endl;
it = find(nums.begin(), nums.end(), 6);
if (it != nums.end())
cout << "Find 6: " << *it << endl;
else
cout << "Not found." << endl;
//输出结果:
//Find 3: 3
//Not found.
accumulate算法可以用于对序列中的元素进行累加或者求和操作。
template <class InputIterator, class T>
T accumulate (InputIterator first, InputIterator last, T init);
template <class InputIterator, class T, class BinaryFunction>
T accumulate (InputIterator first, InputIterator last, T init, BinaryFunction binary_op);
第一个版本直接对元素进行加法操作,第二个版本可以手动指定一个操作函数。
例如,以下是一个求和的例子:
vector<int> nums({1,2,3,4,5});
int sum = accumulate(nums.begin(), nums.end(), 0);
cout << "Sum: " << sum << endl;
//输出结果:
//Sum: 15
transform算法可以用于对序列中的元素进行指定的操作,并将操作结果存储到另一个序列中。
template<class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform(InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op);
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation binary_op);
第一个版本对序列中的元素进行一元操作,将操作结果存储到result序列中;第二个版本对两个序列的元素进行二元操作,将操作结果存储到result序列中。
例如,以下是一个将数组中的元素转换成它的平方的例子:
int nums[] = {1,2,3,4,5};
int square[5];
transform(nums, nums+5, square, [](int x){return x*x;});
for (int i = 0; i < 5; i++)
cout << square[i] << " ";
//输出结果:1 4 9 16 25
copy算法可以用于将序列中的元素复制到另一个序列中。
template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
例如,以下是一个将vector中的元素复制到另一个vector中的例子:
vector<int> nums({1,2,3,4,5});
vector<int> copy_nums(5);
copy(nums.begin(), nums.end(), copy_nums.begin());
for (int i = 0; i < 5; i++)
cout << copy_nums[i] << " ";
//输出结果:1 2 3 4 5
merge算法可以用于将两个有序序列合并成一个有序序列。
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);
例如,以下是一个将两个有序vector合并成一个有序vector的例子:
vector<int> nums1({1,3,5,7,9});
vector<int> nums2({0,2,4,6,8});
vector<int> merge_nums(10);
merge(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), merge_nums.begin());
for (auto num : merge_nums)
cout << num << " ";
//输出结果:0 1 2 3 4 5 6 7 8 9
以上介绍的只是STL算法库中的一部分算法,STL算法库还包含许多其他非常有用的算法,包括unique、reverse、partition等等。熟练运用STL算法库,可以帮助我们更加方便、高效地完成许多常见的操作。