C++_3——库(numeric、limits、math)
这一系列文章的目的是在学习了C++基础后,继续补充一些C++基础和进阶的知识点,包括C++11的相关内容。
以C++11标准为基础。
limits
这个库给出了编译平台的一些算数类型的属性
std::numeric_limits<double>::infinity(); // 返回 double的正无穷大
std::numeric_limits<int>::min(); // 返回 int的最小值
std::numeric_limits<int>::max(); // 返回 int的最大值
std::numeric_limits<int>::is_signed; // 判断类型有无符号,返回bool
std::numeric_limits<int>::has_infinity; // 判断类型是否存在正无穷的表示
std::numeric_limits<double>::epsilon(); // 返回 1与可表示的大于1的最小值之间的差 近似的0
C++数学库numeric
- 累积 accumulate,可自定义求和方式
#include <iostream> // std::cout
#include <functional> // std::minus
#include <numeric> // std::accumulate
int myfunction (int x, int y) {return x+2*y;}
struct myclass {
int operator()(int x, int y) {return x+3*y;}
} myobject;
int main () {
int init = 100;
int numbers[] = {10,20,30};
std::cout << "using default accumulate: ";
std::cout << std::accumulate(numbers,numbers+3,init);
std::cout << '\n';
std::cout << "using functional's minus: ";
std::cout << std::accumulate (numbers, numbers+3, init, std::minus<int>());
std::cout << '\n';
std::cout << "using custom function: ";
std::cout << std::accumulate (numbers, numbers+3, init, myfunction);
std::cout << '\n';
std::cout << "using custom object: ";
std::cout << std::accumulate (numbers, numbers+3, init, myobject);
std::cout << '\n';
return 0;
}
using default accumulate: 160
using functional's minus: 40
using custom function: 220
using custom object: 280
- 计算相邻 adjacent_difference,
#include <iostream> // std::cout
#include <functional> // std::multiplies
#include <numeric> // std::adjacent_difference
int myop (int x, int y) {return x+y;}
int main () {
int val[] = {1,2,3,5,9,11,12};
int result[7];
std::adjacent_difference (val, val+7, result);
std::cout << "using default adjacent_difference: ";
for (int i=0; i<7; i++) std::cout << result[i] << ' ';
std::cout << '\n';
std::adjacent_difference (val, val+7, result, std::multiplies<int>());
std::cout << "using functional operation multiplies: ";
for (int i=0; i<7; i++) std::cout << result[i] << ' ';
std::cout << '\n';
std::adjacent_difference (val, val+7, result, myop);
std::cout << "using custom function: ";
for (int i=0; i<7; i++) std::cout << result[i] << ' ';
std::cout << '\n';
return 0;
}
using default adjacent_difference: 1 1 1 2 4 2 1
using functional operation multiplies: 1 2 6 15 45 99 132
using custom function: 1 3 5 8 14 20 23
- 计算内积 inner_product
#include <iostream> // std::cout
#include <functional> // std::minus, std::divides
#include <numeric> // std::inner_product
int myaccumulator (int x, int y) {return x-y;}
int myproduct (int x, int y) {return x+y;}
int main () {
int init = 100;
int series1[] = {10,20,30};
int series2[] = {1,2,3};
std::cout << "using default inner_product: ";
std::cout << std::inner_product(series1,series1+3,series2,init);
std::cout << '\n';
std::cout << "using functional operations: ";
std::cout << std::inner_product(series1,series1+3,series2,init,
std::minus<int>(),std::divides<int>());
std::cout << '\n';
std::cout << "using custom functions: ";
std::cout << std::inner_product(series1,series1+3,series2,init,
myaccumulator,myproduct);
std::cout << '\n';
return 0;
}
using default inner_product: 240
using functional operations: 70
using custom functions: 34
- 计算部分和 partial_sum
#include <iostream> // std::cout
#include <functional> // std::multiplies
#include <numeric> // std::partial_sum
int myop (int x, int y) {return x+y+1;}
int main () {
int val[] = {1,2,3,4,5};
int result[5];
std::partial_sum (val, val+5, result);
std::cout << "using default partial_sum: ";
for (int i=0; i<5; i++) std::cout << result[i] << ' ';
std::cout << '\n';
std::partial_sum (val, val+5, result, std::multiplies<int>());
std::cout << "using functional operation multiplies: ";
for (int i=0; i<5; i++) std::cout << result[i] << ' ';
std::cout << '\n';
std::partial_sum (val, val+5, result, myop);
std::cout << "using custom function: ";
for (int i=0; i<5; i++) std::cout << result[i] << ' ';
std::cout << '\n';
return 0;
}
using default partial_sum: 1 3 6 10 15
using functional operation multiplies: 1 2 6 24 120
using custom function: 1 4 8 13 19
- iota
Store increasing sequence (function template )
C数学库math.h
- gamma函数
#include <math.h>
double tgamma (double x);
float tgamma (float x);
long double tgamma (long double x);
double tgamma (T x); // additional overloads for integral types
- 取整
// floor向下取整
cout<<floor(4.4)<<endl;//4
cout<<floor(4.5)<<endl;//4
// ceil向上取整
cout<<ceil(4.4)<<endl;//5
cout<<ceil(4.5)<<endl;//5
// round四舍五入
cout<<round(4.4)<<endl;//4
cout<<round(4.5)<<endl;//5
// 返回的是double,不是int
- atan与atan2
atan(dy/dx); // 返回角度范围是[-pi/2 , pi/2]
atan2 (y,x); // 返回角度范围是[-pi , pi]