std::complex
来自cppreference.com
在标头 <complex> 定义 | ||
template<class T > class complex; | (1) | |
template<>class complex<float>; | (2) | (C++23 前) |
template<>class complex<double>; | (3) | (C++23 前) |
template<>class complex<longdouble>; | (4) | (C++23 前) |
std::complex
针对无 cv 限定的标准(C++23 前)浮点数类型的特化,是用于复数的表示和操作的可平凡复制(TriviallyCopyable) 的(C++23 起)字面类型(LiteralType) 。
目录 |
[编辑]模板形参
T | - | 实部和虚部的类型。当 T 不是无 cv 限定的标准(C++23 前)浮点数类型则其行为未指定(编译可能会失败),而当 T 不是数值类型(NumericType) 时行为未定义。 |
[编辑]成员类型
成员类型 | 定义 |
value_type | T |
[编辑]成员函数
构造一个复数 (公开成员函数) | |
赋值内容 (公开成员函数) | |
访问复数的实部 (公开成员函数) | |
访问复数的虚部 (公开成员函数) | |
两个复数,或一个复数与一个标量的复合赋值 (公开成员函数) |
[编辑]非成员函数
对复数运用一元运算符 (函数模板) | |
在两个复数,或一个复数与一个标量上进行复数算术运算 (函数模板) | |
(C++20 移除) | 比较两个复数,或一个复数与一个标量 (函数模板) |
复数的序列化和反序列化 (函数模板) | |
(C++26) | 从 std::complex 获取到实部或虚部的引用 (函数模板) |
返回实部 (函数模板) | |
返回虚部 (函数模板) | |
返回复数的模 (函数模板) | |
返回辐角 (函数模板) | |
返回模(范数)的平方 (函数模板) | |
返回复共轭 (函数模板) | |
(C++11) | 返回到黎曼球上的投影 (函数模板) |
从模和辐角构造复数 (函数模板) | |
指数函数 | |
以 e 为底复数的指数 (函数模板) | |
沿负实轴切割的复自然对数 (函数模板) | |
沿负实轴分割的复常用对数 (函数模板) | |
幂函数 | |
复数幂,一或两个实参可为复数 (函数模板) | |
右半平面范围中的复平方根 (函数模板) | |
三角函数 | |
计算复数的正弦(sin(z)) (函数模板) | |
计算复数的余弦(cos(z)) (函数模板) | |
计算复数的正切(tan(z)) (函数模板) | |
(C++11) | 计算复数的反正弦(arcsin(z)) (函数模板) |
(C++11) | 计算复数的反余弦(arccos(z)) (函数模板) |
(C++11) | 计算复数的反正切(arctan(z)) (函数模板) |
双曲函数 | |
计算复数的双曲正弦(sinh(z)) (函数模板) | |
计算复数的双曲余弦(cosh(z)) (函数模板) | |
计算复数的双曲正切(tanh(z)) (函数模板) | |
(C++11) | 计算复数的反双曲正弦(arsinh(z)) (函数模板) |
(C++11) | 计算复数的反双曲余弦(arcosh(z)) (函数模板) |
(C++11) | 计算复数的反双曲正切(artanh(z)) (函数模板) |
[编辑]辅助类型
获取 std::complex 的大小 (类模板特化) | |
获取 std::complex 的底层实部和虚部的数值类型 (类模板特化) |
[编辑]通过数组访问
对于任何 std::complex<T>
类型的对象 z,reinterpret_cast<T(&)[2]>(z)[0] 是 z 的实部,reinterpret_cast<T(&)[2]>(z)[1] 是 z 的虚部。
对于任何指向 complex<T>
数组元素的指针 p 及任何合法索引 i,reinterpret_cast<T*>(p)[2* i] 是复数 p[i] 的实部,而 reinterpret_cast<T*>(p)[2* i +1] 是复数 p[i] 的虚部。
此要求的目的是 C++ 复数类型与 C 语言复数类型(以及它的数组)的二进制兼容性,其中要求相同的对象表示。
[编辑]实现注解
为满足数组访问的要求,实现需满足在单独且相邻的内存位置存储 std::complex
特化的实部和虚部。它的非静态数据成员可能的声明包括:
- 数组类型
value_type[2]
,它的第一个元素存储实部,第二个元素存储虚部(例如 Microsoft Visual Studio); - 单个
value_type _Complex
类型成员(封装对应的 C 语言复数类型)(例如 GNU libstdc++); - 两个拥有相同访问权限的
value_type
类型成员,分别存储实部和虚部(例如 LLVM libc++)。
实现不能添加会占用与实部和虚部冲突的存储的非静态数据成员,而且必须确保类模板特化不含任何填充位。实现也必须确保对数组访问的优化问题,其中要考虑到指向 value_type
的指针可能是 std::complex
特化的别名,对应的数组也是这样。
[编辑]字面量
在内联命名空间 std::literals::complex_literals 定义 | |
表示纯虚数的 std::complex 字面量 (函数) |
[编辑]注解
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_constexpr_complex | 201711L | (C++20) | 向 <complex> 的简单复数函数添加 constexpr |
202306L | (C++26) | 使 <complex> 更 constexpr | |
__cpp_lib_tuple_like | 202311L | (C++26) | 为 std::complex 添加元组协议 |
[编辑]示例
运行此代码
#include <cmath>#include <complex>#include <iomanip>#include <iostream>#include <ranges> int main(){usingnamespace std::complex_literals;std::cout<<std::fixed<<std::setprecision(1); std::complex<double> z1 = 1i * 1i;// 虚数单位平方std::cout<<"i * i = "<< z1 <<'\n'; std::complex<double> z2 =std::pow(1i, 2);// 虚数单位平方std::cout<<"pow(i, 2) = "<< z2 <<'\n'; constdouble PI =std::acos(-1);// C++20 也提供了 std::numbers::pi std::complex<double> z3 =std::exp(1i * PI);// 欧拉方程std::cout<<"exp(i * pi) = "<< z3 <<'\n'; std::complex<double> z4 =1. + 2i, z5 =1. - 2i;// 共轭std::cout<<"(1 + 2i) * (1 - 2i) = "<< z4 * z5 <<'\n'; constauto zz ={0.0+ 1i, 2.0+ 3i, 4.0+ 5i};#if __cpp_lib_tuple_like >= 202311Lfor(double re : zz | std::views::keys)std::cout<< re <<' ';std::cout<<'\n';for(double im : zz | std::views::values)std::cout<< im <<' ';std::cout<<'\n';#elsefor(double re : zz | std::views::transform([](auto z){return z.real();}))std::cout<< re <<' ';std::cout<<'\n';for(double im : zz | std::views::transform([](auto z){return z.imag();}))std::cout<< im <<' ';std::cout<<'\n';#endif}
输出:
i * i = (-1.0,0.0) pow(i, 2) = (-1.0,0.0) exp(i * pi) = (-1.0,0.0) (1 + 2i) * (1 - 2i) = (5.0,0.0) 0.0 2.0 4.0 1.0 3.0 5.0
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 387 | C++98 | std::complex 不保证与 C 语言的 complex 兼容 | 保证兼容 |
[编辑]参阅
复数算术的 C 文档 |