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<long double>; |
(4) | (直到 C++23) |
std::complex
对 cv 无限定的 标准(直到 C++23) 浮点类型 的特化是 TriviallyCopyable(自 C++23 起) LiteralTypes,用于表示和操作 复数.
内容 |
[编辑] 模板参数
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的虚部。
对于任何指向名为p的std::complex<T>
数组元素的指针,以及任何有效的数组索引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) | 更多 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; // 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 文档 关于 复数算术
|