Namespaces
Variants

std:: complex

From cppreference.net
定义于头文件 <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)
比较两个复数或一个复数与标量
(函数模板)
序列化与反序列化复数
(函数模板)
std::complex 对象获取实部或虚部的引用
(函数模板)
返回实部
(函数模板)
返回虚部
(函数模板)
返回复数的模
(函数模板)
返回相位角
(函数模板)
返回模的平方
(函数模板)
返回复共轭
(函数模板)
(C++11)
返回在黎曼球面上的投影
(函数模板)
根据模长和相位角构造复数
(函数模板)
指数函数
复数以 e 为底的指数函数
(函数模板)
沿负实轴分支切割的复数自然对数
(函数模板)
沿负实轴有分支切割的复数常用对数
(函数模板)
幂函数
复数幂运算,一个或两个参数可以是复数
(函数模板)
右半平面范围内的复数平方根
(函数模板)
三角函数
计算复数的正弦值( sin(z)
(函数模板)
计算复数的余弦值( cos(z)
(函数模板)
计算复数的正切值( tan(z)
(函数模板)
计算复数的反正弦( arcsin(z)
(函数模板)
计算复数的反余弦值( arccos(z)
(函数模板)
计算复数的反正切( arctan(z)
(函数模板)
双曲函数
计算复数的双曲正弦值( sinh(z)
(函数模板)
计算复数的双曲余弦值( cosh(z)
(函数模板)
计算复数的双曲正切值( tanh(z)
(函数模板)
计算复数的反双曲正弦( arsinh(z)
(函数模板)
计算复数的反双曲余弦( arcosh(z)
(函数模板)
计算复数的反双曲正切( 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 字面量
(函数)

注释

功能测试 标准 功能
__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 文档 关于 复数运算