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 開始) 的 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 的虛部。
對於名為 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 字面量 (函式) |
[編輯] 注意
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_constexpr_complex |
201711L |
(C++20) | <complex> 中的 constexpr 簡單複數數學函式 |
202306L |
(C++26) | <complex> 的更多 constexpr | |
__cpp_lib_tuple_like |
202311L |
(C++26) | 為 std::complex 新增 tuple 協議 |
[編輯] 示例
執行此程式碼
#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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 387 | C++98 | std::complex 不保證與 C complex 相容 |
保證相容 |
[編輯] 另請參閱
C 文件 關於 複數算術
|