C艹算法库

发布于 2024-08-14  30 次阅读


C艹算法库

<algorithm>用于操作容器(如数组、向量、列表等)的算法。这些算法包括排序、搜索、复制、比较等

排序算法

函数:std::sort

定义:对容器中的元素进行排序。

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

bool compare(int a, int b) {
    return a < b;
}

int main() {
    std::vector<int> v = {5, 3, 9, 1, 4};
    std::sort(v.begin(), v.end(), compare); // 使用自定义比较函数
    for (int i : v) {
        std::cout << i << " "; // 输出: 1 3 4 5 9
    }

    std::sort(v.begin(), v.end(), std::less<int>()); // 使用标准库比较函数对象
    for (int i : v) {
        std::cout << i << " "; // 输出: 1 3 4 5 9
    }

    return 0

其中 compare 是一个可选的比较函数,用于自定义排序方式。

搜索算法

函数:std::find

定义:在容器中查找与给定值匹配的第一个元素。

语法:

auto it = find(container.begin(), container.end(), value);

如果找到,it 将指向匹配的元素;如果没有找到,it 将等于 container.end()

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
  std::vector<int> numbers = {1, 2, 3, 4, 5};
  auto it = std::find(numbers.begin(), numbers.end(), 3);

  if (it != numbers.end()) {
    std::cout << "Found: " << *it << std::endl;//Found: 3
  } else {
    std::cout << "Value not found." << std::endl;
  }

  return 0;
}

复制算法

函数:std::copy

定义:将一个范围内的元素复制到另一个容器或数组。

语法:

copy(source_begin, source_end, destination_begin);
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
  std::vector<int> source = {1, 2, 3, 4, 5};
  int destination[5];
  std::copy(source.begin(), source.end(), destination);

  for (int i = 0; i < 5; ++i) {
    std::cout << destination[i] << " ";//1 2 3 4 5
  }
  std::cout << std::endl;

  return 0;
}

比较算法

函数:std::equal

定义:比较两个容器或两个范围内的元素是否相等。

语法:

bool result = equal(first1, last1, first2, compare_function);
\#include <algorithm>
\#include <vector>
\#include <iostream>

bool custom_compare(int a, int b) {
    return (a % 10) == (b % 10); // 比较个位数是否相等
}

int main() {
  std::vector<int> v1 = {1, 2, 3, 4, 5};
  std::vector<int> v2 = {1, 2, 3, 4, 5};

  bool are_equal = std::equal(v1.begin(), v1.end(), v2.begin(), custom_compare);
  std::cout << (are_equal ? "Vectors are equal." : "Vectors are not equal.") << std::endl;

  return 0;
}

常用的函数对象

<functional> 头文件中定义了一些常用的函数对象,包括:

std::function 是一个通用的多态函数封装器,它可以保存、复制和调用任何可以调用的目标(如函数指针、Lambda 表达式、绑定表达式、或者其他可调用对象)。

#include <functional>
#include <iostream>

void say_hello() {
    std::cout << "Hello, World!\n";
}

int main() {
    std::function<void()> func = say_hello;
    func(); // 调用封装的函数
    return 0;
}

std::bind 用于绑定函数的部分参数,返回一个新的函数对象,该对象可以通过传递剩余的参数来调用。

#include <functional>
#include <iostream>

int add(int a, int b) {
    return a + b;
}

int main() {
    auto add_five = std::bind(add, 5, std::placeholders::_1);//相当于替换函数名
    std::cout << add_five(3) << "\n"; // 输出8
    return 0;
}

std::less<T>: 封装了小于运算符 <。用于比较两个对象,判断前一个对象是否小于后一个对象。

std::greater<T>:封装了大于运算符 >。用于比较两个对象,判断前一个对象是否大于后一个对象。

std::equal_to<T>:封装了相等运算符 ==。用于比较两个对象是否相等。

std::not_equal_to<T>: 封装了不等运算符 !=。用于比较两个对象是否不相等。

std::greater_equal<T>:封装了大于等于运算符 >=。用于比较前一个对象是否大于或等于后一个对象。

std::less_equal<T>:封装了小于等于运算符 <=。用于比较前一个对象是否小于或等于后一个对象。

std::plus<T>: 实现加法运算符 +

std::minus<T>: 实现减法运算符 -

std::multiplies<T>: 实现乘法运算符 *

std::divides<T>: 实现除法运算符 /

std::modulus<T>: 实现取模运算符 %

std::unary_negate: 用于对一元谓词进行逻辑取反。

std::binary_negate: 用于对二元谓词进行逻辑取反(C++20 中已弃用)。

std::logical_and<T>: 实现逻辑与运算符 &&

std::logical_or<T>: 实现逻辑或运算符 ||

std::logical_not<T>: 实现逻辑非运算符 !

QQ:2219349024
最后更新于 2024-08-14