std:: complex
|
定义于头文件
<complex>
|
||
|
template
<
class
T
>
class complex ; |
(1) | |
|
template
<>
class
complex
<
float
>
;
|
(2) | (C++23 前) |
|
template
<>
class
complex
<
double
>
;
|
(3) | (C++23 前) |
|
template
<>
class
complex
<
long
double
>
;
|
(4) | (C++23 前) |
针对cv非限定的
标准
(直至 C++23)
浮点类型
的
std::complex
特化是
TriviallyCopyable
(自 C++23 起)
LiteralType
s
,用于表示和操作
复数
。
目录 |
模板参数
| T | - |
实部与虚部的类型。若
T
不是无cv限定的
标准
(C++23 前)
浮点类型,则行为未指定(且可能编译失败);若
T
不符合
NumericType
要求,则行为未定义。
|
成员类型
| 成员类型 | 定义 |
value_type
|
T
|
成员函数
|
构造复数对象
(公开成员函数) |
|
|
赋值操作
(公开成员函数) |
|
|
访问复数的实部
(公开成员函数) |
|
|
访问复数的虚部
(公开成员函数) |
|
|
两个复数或复数与标量的复合赋值运算
(公开成员函数) |
非成员函数
|
对复数应用一元运算符
(函数模板) |
|
|
对两个复数或一个复数与标量执行复数算术运算
(函数模板) |
|
|
(removed in 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)
)
(函数模板) |
辅助类型
|
(C++26)
|
获取
std::complex
的大小
(类模板特化) |
|
获取
std::complex
的底层实数和虚数类型
(类模板特化) |
面向数组的访问
对于任何类型为
std::complex<T>
的对象
z
,
reinterpret_cast
<
T
(
&
)
[
2
]
>
(
z
)
[
0
]
表示
z
的实部,
reinterpret_cast
<
T
(
&
)
[
2
]
>
(
z
)
[
1
]
表示
z
的虚部。
对于指向
std::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) | constexpr 简单复数数学函数于 <complex> |
202306L
|
(C++26) | 更多 constexpr 支持用于 <complex> | |
__cpp_lib_tuple_like
|
202311L
|
(C++26) |
为
std::complex
添加元组协议支持
|
示例
#include <cmath> #include <complex> #include <iomanip> #include <iostream> #include <ranges> int main() { using namespace 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'; const double 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.0 + 2i, z5 = 1.0 - 2i; // 共轭复数 std::cout << "(1 + 2i) * (1 - 2i) = " << z4 * z5 << '\n'; const auto zz = {0.0 + 1i, 2.0 + 3i, 4.0 + 5i}; #if __cpp_lib_tuple_like >= 202311L for (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'; #else for (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++ 标准。
| DR | 适用版本 | 发布行为 | 正确行为 |
|---|---|---|---|
| LWG 387 | C++98 |
std::complex
未保证与C语言的
complex
兼容
|
保证兼容性 |
另请参阅
|
C 文档
关于
复数运算
|