当前位置:   article > 正文

c++ stl算法库常见算法_c++ 算法库有哪些算法

c++ 算法库有哪些算法

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);
  • 1
  • 2
  • 3
  • 4
功能
  • 将[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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
代码示例
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

for_each

定义
#include <algorithm>

template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function fn);
  • 1
  • 2
  • 3
  • 4
功能
  • 对范围在[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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
代码示例
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

remove

定义
template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
  • 1
  • 2
功能
  • 删除范围 [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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
代码示例
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

remove_if

定义
template <class ForwardIterator, class UnaryPredicate> 
  ForwardIterator remove_if (ForwardIterator first, ForwardIterator last, 
                             UnaryPredicate pred);
  • 1
  • 2
  • 3
功能
  • 删除指定范围的元素
该函数实现类似如下
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
代码示例
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
功能
  • 对于默认行为的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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
功能
  • 默认行为:对范围 [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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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 );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
功能
  • 同sort两个版本一样,但该函数保留相等元素的相对位置,是一个稳定的快排

find

定义
template <class InputIterator, class T>
   InputIterator find (InputIterator first, InputIterator last, const T& val);
  • 1
  • 2
功能
  • 在范围[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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
代码示例
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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

find_if_not(c++11)

定义
template <class InputIterator, class UnaryPredicate> 
   InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
  • 1
  • 2
功能
  • 当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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
代码示例
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/941443
推荐阅读
相关标签
  

闽ICP备14008679号