std::complex
来自 cppreference.cn
定义于头文件 <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) |
std::complex
的特化,用于 cv 限定符非限定的 标准(直到 C++23) 浮点类型 是 TriviallyCopyable(自 C++23 起) 字面类型,用于表示和操作 复数。
内容 |
[编辑] 模板形参
T | - | 实部和虚部的类型。如果 T 不是 cv 限定符非限定的 标准(直到 C++23) 浮点类型,则行为未指定(并且可能无法编译),如果 T 不是 数值类型,则行为未定义。 |
[编辑] 成员类型
成员类型 | 定义 |
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 的虚部。
对于任何指向 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 字面量 (函数) |
[编辑] 注释
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_lib_constexpr_complex |
201711L |
(C++20) | constexpr <complex> 中的简单复数数学函数 |
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() { using namespace std::complex_literals; std::cout << std::fixed << std::setprecision(1); std::complex<double> z1 = 1i * 1i; // imaginary unit squared std::cout << "i * i = " << z1 << '\n'; std::complex<double> z2 = std::pow(1i, 2); // imaginary unit squared std::cout << "pow(i, 2) = " << z2 << '\n'; const double PI = std::acos(-1); // or std::numbers::pi in C++20 std::complex<double> z3 = std::exp(1i * PI); // Euler's formula std::cout << "exp(i * pi) = " << z3 << '\n'; std::complex<double> z4 = 1.0 + 2i, z5 = 1.0 - 2i; // conjugates 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 文档 关于 复数算术
|