c++ STL算法库常见算法
本文将简介c++stl中一些常用算法copy、for_each、remove、remove_if、sort、partial_sort、stable_sort、find、find_if_not。当然还有很多,后续博客会继续总结!
copy
定义
#include <algorithm>
template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
功能
- 将[first, last)之间的元素元素复制到result
该函数实现类似如下
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result; ++first;
}
return result;
}
代码示例
void test()
{
vector<int> vec = {1, 9, 9, 5, 8, 1};
// 使用copy将vec从头到尾通过输出流输出
copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
cout << endl;
// 使用copy将vec的元素拷贝到vec1中
vector<int> vec1(vec.size());
auto it = copy(vec.begin(), vec.end(), vec1.begin());
// copy返回值是已经复制了元素的末尾指针
//(不含最后一个元素,想要获取最后一个元素,所以需要往前偏移一个指针)
cout << "it = " << *(it - 1) << endl;
cout << "vec1的元素:";
for (auto elem : vec1)
{
cout << elem << " ";
}
cout << endl;
}
for_each
定义
#include <algorithm>
template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function fn);
功能
- 对范围在[first,last)的元素应用fn函数
该函数实现类似如下
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
while (first!=last) {
fn (*first);
++first;
}
return fn; // or, since C++11: return move(fn);
}
代码示例
void print(int &value)
{
value *= 9;
cout << value << " ";
}
void test()
{
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};
copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
cout << endl;
// 按照print函数的方式操作vec
for_each(vec.begin(), vec.end(), print);
cout << endl;
cout << "lambda" << endl;
// 采用匿名函数(lambda表达式)
for_each(vec.begin(), vec.end(), [](int &value)
{
value += 1;
cout << value << " "; });
cout << endl;
}
remove
定义
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
功能
- 删除范围 [first, last)之间值等于val的元素
该函数的实现类似如下
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator result = first;
while (first!=last) {
if (!(*first == val)) {
if (result!=first)
*result = move(*first);
++result;
}
++first;
}
return result;
}
代码示例
void test()
{
vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 1};
// 删除vec中元素为1的元素,返回没有被删除的元素的末尾
auto it = remove(vec.begin(), vec.end(), 1);
for (auto p = vec.begin(); p != it; ++p)
{
cout << *p << " ";
}
cout << endl;
}
remove_if
定义
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
功能
- 删除指定范围的元素
该函数实现类似如下
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred)
{
ForwardIterator result = first;
while (first!=last) {
if (!pred(*first)) {
if (result!=first)
*result = std::move(*first);
++result;
}
++first;
}
return result;
}
代码示例
int func(int val)
{
return val > 5;
}
void test()
{
vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 1};
// 返回值指向未删除的最后一个元素之后的元素的迭代器
auto it = remove_if(vec.begin(), vec.end(), func);
// 删除所有需要删除元素(val > 5)
vec.erase(it, vec.end());
for (auto elem : vec)
{
cout << elem << " ";
}
cout << endl;
}
sort
定义
default (1) // 默认行为
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2) // 自定义行为
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
功能
- 对于默认行为的sort:对范围[first,last)的元素进行升序快排(不稳定)
- 对于自定义行为的sort:对范围[first,last)的元素使用自定义的比较方式comp进行排序
代码示例
bool myComp(int x, int y)
{
// 按照由大到小的方式排序
return x > y;
}
void test()
{
vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 9};
// 使用默认行为的sort
cout << "使用默认行为排序的sort!" << endl;
sort(vec.begin(), vec.end());
for (auto elem : vec)
{
cout << elem << " ";
}
cout << endl;
// 使用自定义行为排序的sort
cout << "使用自定义行为排序的sort!" << endl;
sort(vec.begin(), vec.end(), myComp);
for (auto elem : vec)
{
cout << elem << " ";
}
cout << endl;
}
partial_sort
定义
default (1)
template <class RandomAccessIterator>
void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last, Compare comp);
功能
- 默认行为:对范围 [first,last)中的部分元素重新按照升序的方式排序,排序后前middle个是整个范围内最小的且有小到大的排序的元素
- 自定义行为:按照自定义排序方式对部分元素重新排序
代码示例
bool myComp(int x, int y)
{
// 按照由大到小的方式排序
return x > y;
}
void test2()
{
vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 9};
// 将vec中的元素进行排序,使前五个元素是整个vec范围内最小的5个元素,
// 并且按照升序的方式排序剩余元素不排序
partial_sort(vec.begin(), vec.begin() + 5, vec.end());
for (auto elem : vec)
{
cout << elem << " ";
}
cout << endl;
partial_sort(vec.begin(), vec.begin() + 5, vec.end(), myComp);
for (auto elem : vec)
{
cout << elem << " ";
}
cout << endl;
}
stable_sort
定义
template <class RandomAccessIterator>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
功能
- 同sort两个版本一样,但该函数保留相等元素的相对位置,是一个稳定的快排
find
定义
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
功能
- 在范围[first, end)内查找值为val的元素,成功返回查找到该元素的位置
该函数实现类似如下
template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last) {
if (*first==val) return first;
++first;
}
return last;
}
代码示例
void test()
{
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int>::iterator it = find(vec.begin(), vec.end(), 5);
if (it != vec.end())
{
cout << "element " << *it << " found in vec" << endl;
}
else
{
cout << "not found!" << endl;
}
}
find_if_not(c++11)
定义
template <class InputIterator, class UnaryPredicate>
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
功能
- 当pred返回false时,返回一个指向范围[first,last]中第一个元素的迭代器,如果没有找到这样的元素,则函数返回last。
该函数实现类似如下
template<class InputIterator, class UnaryPredicate>
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (!pred(*first)) return first;
++first;
}
return last;
}
代码示例
bool func(int val)
{
// 返回第一个偶数,当val为偶数时,返回false,停止查找
return val % 2;
}
void test5()
{
vector<int> vec = {7, 1, 9, 7, 5, 8, 1, 2, 6};
// 当func函数返回false时,find_if_not查找完成,并且返回第一个查找的元素
auto it = find_if_not(vec.begin(), vec.end(), func);
cout << "第一个偶数是: " << *it << endl;
}
如果本文对你有帮助,记得一键三连哦,一键三连笑哈哈,代码能力顶呱呱!
本人能力有限,如有错误,望不吝指正;原创不易,欢迎转载,转载请注明出处!