- C 标准库
- C 标准库
- C++ 标准库
- C++ 库 - 首页
- C++ 库 - <fstream>
- C++ 库 - <iomanip>
- C++ 库 - <ios>
- C++ 库 - <iosfwd>
- C++ 库 - <iostream>
- C++ 库 - <istream>
- C++ 库 - <ostream>
- C++ 库 - <sstream>
- C++ 库 - <streambuf>
- C++ 库 - <atomic>
- C++ 库 - <complex>
- C++ 库 - <exception>
- C++ 库 - <functional>
- C++ 库 - <limits>
- C++ 库 - <locale>
- C++ 库 - <memory>
- C++ 库 - <new>
- C++ 库 - <numeric>
- C++ 库 - <regex>
- C++ 库 - <stdexcept>
- C++ 库 - <string>
- C++ 库 - <thread>
- C++ 库 - <tuple>
- C++ 库 - <typeinfo>
- C++ 库 - <utility>
- C++ 库 - <valarray>
- C++ STL 库
- C++ 库 - <array>
- C++ 库 - <bitset>
- C++ 库 - <deque>
- C++ 库 - <forward_list>
- C++ 库 - <list>
- C++ 库 - <map>
- C++ 库 - <multimap>
- C++ 库 - <queue>
- C++ 库 - <priority_queue>
- C++ 库 - <set>
- C++ 库 - <stack>
- C++ 库 - <unordered_map>
- C++ 库 - <unordered_set>
- C++ 库 - <vector>
- C++ 库 - <algorithm>
- C++ 库 - <iterator>
- C++ 高级库
- C++ 库 - <any>
- C++ 库 - <barrier>
- C++ 库 - <bit>
- C++ 库 - <chrono>
- C++ 库 - <cinttypes>
- C++ 库 - <clocale>
- C++ 库 - <condition_variable>
- C++ 库 - <coroutine>
- C++ 库 - <cstdlib>
- C++ 库 - <cstring>
- C++ 库 - <cuchar>
- C++ 库 - <charconv>
- C++ 库 - <cfenv>
- C++ 库 - <cmath>
- C++ 库 - <ccomplex>
- C++ 库 - <expected>
- C++ 库 - <format>
- C++ 库 - <future>
- C++ 库 - <flat_set>
- C++ 库 - <flat_map>
- C++ 库 - <filesystem>
- C++ 库 - <generator>
- C++ 库 - <initializer_list>
- C++ 库 - <latch>
- C++ 库 - <memory_resource>
- C++ 库 - <mutex>
- C++ 库 - <mdspan>
- C++ 库 - <optional>
- C++ 库 - <print>
- C++ 库 - <ratio>
- C++ 库 - <scoped_allocator>
- C++ 库 - <semaphore>
- C++ 库 - <source_location>
- C++ 库 - <span>
- C++ 库 - <spanstream>
- C++ 库 - <stacktrace>
- C++ 库 - <stop_token>
- C++ 库 - <syncstream>
- C++ 库 - <system_error>
- C++ 库 - <string_view>
- C++ 库 - <stdatomic>
- C++ 库 - <variant>
- C++ STL 库速查表
- C++ STL - 速查表
C++ 库 - <variant>
C++ 中的 <variant> 头文件提供了一种类型安全的联合体,称为 std::variant,它允许我们同时处理多种数据类型。此头文件是通用实用程序库的一部分。std::variant 会跟踪当前持有的类型并确保安全访问。我们可以使用 std::visit 轻松处理包含的类型。
包含 <variant> 头文件
要在 C++ 程序中包含 <variant> 头文件,可以使用以下语法。
#include <variant>
<variant> 头文件的函数
以下是 <variant> 头文件中所有函数的列表。
访问器函数
这些函数允许我们访问和操作包含在 std::variant: 中的值(通常是函数或函数对象)。
序号 | 函数及描述 |
---|---|
1 | visit
此函数使用一个或多个变体的参数调用提供的函数对象。 |
2 | holds_alternative
此函数检查变体当前是否持有给定类型。 |
3 | get
此函数读取给定索引或类型(如果类型唯一)的变体的值,在出错时抛出异常。 |
4 | get_if
此函数获取指向给定索引或类型(如果唯一)的指向变体的值的指针,在出错时返回空指针。 |
访问值
在以下示例中,我们将使用 get 函数访问 varient 对象的值。
#include <iostream> #include <variant> int main() { std::variant<int, double> myVariant = 42; int value = std::get<int>(myVariant); std::cout << "The value is: " << value << std::endl; return 0; }
输出
如果我们运行以上代码,它将生成以下输出:
The value is: 42
比较运算符
序号 | 函数及描述 |
---|---|
1 | operator==
此函数检查两个对象是否持有相同的类型,以及它们包含的值是否相等。 |
2 | operator!=
如果两个变体持有不同的类型或其包含的值不相等,则此函数返回 true。 |
3 | operator<=
此函数按字典顺序比较两个对象。如果第一个变体的包含值小于第二个变体的包含值,则返回 true,前提是它们持有相同的类型。 |
4 | operator<=
如果第一个变体小于或等于第二个变体,则此函数返回 true。 |
5 | operator>
此函数检查第一个变体是否大于第二个变体。 |
6 | operator>=
此函数检查第一个变体是否大于或等于第二个变体。 |
7 | operator<=>
此函数/运算符提供两个变体之间的三向比较。 |
值比较
在以下示例中,我们将使用 opearator== 检查两个对象是否包含相同的值。
#include <iostream> #include <variant> int main() { std::variant < int, double > variant1 = 42; std::variant < int, double > variant2 = 42; if (variant1 == variant2) { std::cout << "Variants are equal!" << std::endl; } else { std::cout << "Variants are not equal." << std::endl; } return 0; }
输出
以下是上述代码的输出:
Variants are equal!
实用程序函数
序号 | 函数及描述 |
---|---|
1 | std::swap
此函数模板专门化了 std::swap 算法。 |
交换两个变体
在以下示例中,我们将使用 std::swap 交换两个变体的内容。
#include <iostream> #include <variant> #include <utility> int main() { std::variant<int, double> v1 = 100, v2 = 3.14; std::cout <<"Before: v1 = " << std::get<int>(v1) << ", v2 = " << std::get<double>(v2) << std::endl; std::swap(v1, v2); std::cout << "After: v1 = " << std::get<double>(v1) << ", v2 = " << std::get<int>(v2) << std::endl; return 0; }
输出
上述代码的输出如下:
Before: v1 = 100, v2 = 3.14 After: v1 = 3.14, v2 = 100