c++ stl算法库常见算法

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;
}

如果本文对你有帮助,记得一键三连哦,一键三连笑哈哈,代码能力顶呱呱!

本人能力有限,如有错误,望不吝指正;原创不易,欢迎转载,转载请注明出处!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值