首页 > 其他分享 >std::optional

std::optional

时间:2024-07-18 10:56:01浏览次数:15  
标签:std cout value vec optional opt3

在 C++17 中,std::optional 是一个非常有用的类型,它用于封装一个可能不存在的值。它提供了一种安全的方式来处理可能为空的值,避免了使用 NULLnullptr 带来的问题。

以下是 std::optional 的一些基本用法:

  1. 创建 std::optional 对象

    • 使用 std::nulloptstd::make_optional 创建一个空的 std::optional
    • 使用值初始化创建一个非空的 std::optional
    std::optional<int> opt1 = std::nullopt; // 创建一个空的optional
    std::optional<int> opt2 = std::make_optional(10); // 创建一个包含10的optional
    std::optional<int> opt3(20); // 创建一个包含20的optional
    
  2. 访问 std::optional 的值

    • 使用 * 运算符或 -> 运算符访问值。
    • 使用 value() 方法访问值,如果 optional 是空的,则抛出 std::bad_optional_access 异常。
    if (opt3.has_value()) {
        std::cout << *opt3 << std::endl; // 输出20
        int value = opt3.value(); // 获取值
    } else {
        std::cout << "opt3 is empty" << std::endl;
    }
    
  3. 检查 std::optional 是否有值

    • 使用 has_value() 方法检查 optional 是否包含值。
    if (opt3.has_value()) {
        std::cout << "opt3 has a value" << std::endl;
    } else {
        std::cout << "opt3 is empty" << std::endl;
    }
    
  4. 赋值和重置

    • 可以给 optional 赋值,也可以使用 reset() 方法将其重置为无值状态。
    opt3 = 30; // 赋值
    opt3.reset(); // 重置为无值
    
  5. 使用 std::optional 作为函数参数和返回类型

    • 可以将 optional 用作函数参数,表示函数可以返回一个可选的值。
    • 可以将 optional 用作函数的返回类型,表示函数可以返回一个可选的结果。
    std::optional<int> find_value(const std::vector<int>& vec, int value) {
        for (int v : vec) {
            if (v == value) {
                return v;
            }
        }
        return std::nullopt;
    }
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5};
        auto result = find_value(vec, 3);
        if (result.has_value()) {
            std::cout << "Found value: " << *result << std::endl;
        } else {
            std::cout << "Value not found" << std::endl;
        }
        return 0;
    }
    
  6. 比较 std::optional 对象

    • 可以比较两个 optional 对象,如果它们都包含值,则比较这些值;如果其中一个为空,则比较结果取决于另一个 optional 是否为空。
    std::optional<int> opt4(10);
    std::optional<int> opt5(20);
    std::optional<int> opt6 = std::nullopt;
    
    if (opt4 == opt5) {
        std::cout << "opt4 and opt5 have the same value" << std::endl;
    } else if (opt4 == opt6) {
        std::cout << "opt4 is empty or has the same value as opt6" << std::endl;
    } else {
        std::cout << "opt4 and opt5 have different values" << std::endl;
    }
    

通过这些基本用法,你可以在 C++ 中更安全、更灵活地处理可能为空的值。

标签:std,cout,value,vec,optional,opt3
From: https://blog.csdn.net/weixin_44506510/article/details/140493256

相关文章

  • optional
    作用:用来包装一个可能存在也可能不存在的值当存在时我们可以选择返回其中内容,不存在时返回空;代码示例:#include<iostream>#include<optional>#include<string>#include<fstream>std::optional<std::string>ReadFileAsString(conststd::string&filepath){std::i......
  • asyncio/trio fastdfs python client
    Codets.py#!/usr/bin/envpython"""FastDFS并发测试脚本Usage::$python<me>.py200--show"""importfunctoolsimportitertoolsimportjsonimportosimportpickleimportsysimporttimefrompathlibimportPathfr......
  • Windows系统安装RustDesk Server的详细步骤和客户端设置
    Windows系统安装RustDeskServer的详细步骤在Windows系统上安装RustDeskServer涉及几个关键步骤,包括安装必要的依赖、下载RustDeskServer程序、配置并启动服务。以下是详细的步骤:1.安装Node.js和PM2RustDeskServer的某些版本可能需要Node.js环境来运行,而PM2是一个常用的Nod......
  • 异步编程秘籍:一探std::future的魔法,让代码飞起来
    ......
  • 2024春秋杯 stdout
    考点:文件,setvbuf缓冲区,ret2syscall,ret2csu题目给了libc文件。main函数和vlun函数存在明显的栈溢出int__cdeclmain(intargc,constchar**argv,constchar**envp){charbuf[80];//[rsp+0h][rbp-50h]BYREFinit(argc,argv,envp);puts("whereismystdout?......
  • std::vector 中查找某个元素是否存在
    std::vector中不存在直接查找某个元素是否存在的方法,一般是通过<algorithm>中的std::find,std::find_if,std::count,std::count_if等方法的返回值来判断对应元素是否存在。如当vector中存储的元素为double类型时,需要设定其精度,判断代码如下#include<vector>#include......
  • 多线程编程的基本概念,C++标准库中的多线程支持(std::thread,std::async),如何处理线程同步
    多线程编程在现代计算机系统中非常重要,因为它能够使程序同时执行多个操作,提高计算效率。以下是多线程编程的基本概念及如何在C++标准库中使用std::thread和std::async进行多线程编程,同时处理线程同步和并发问题。多线程编程的基本概念线程(Thread):线程是一个轻量级的进程,是......
  • 丝滑解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_
    基础环境:MacOSm1、python=3.9前情提要:在Anaconda终端运行代码的时候,显示报错:importError:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:version`GLIBCXX_3.4.29'notfound1问题分析:根据提示是/usr/lib/x86_64-linux-gnu/路径下的libstdc++.so.6缺少版本GLIBCXX_3.4.29解......
  • 深入解析C++标准库中的std::vector容器
    1.底层实现std::vector 是C++标准库中的一个模版类,用于动态数组。它的底层实现可以理解为一个动态分配的连续内存块,当需要更多空间时,内存会自动扩展。内存分配:vector 使用一块连续的内存存储元素。当插入新元素导致容量不足时,vector 会分配一块更大的内存(通常是当前容量......
  • std::future 如何保存多个对象进行同步等待
    std::future是一个C++11引入的标准库类,可用于异步获取计算结果。通常情况下,std::future可以通过get()函数来等待异步操作完成,并获取其结果。如果需要等待多个异步操作完成并获取它们各自的结果,可以使用std::future的姊妹类std::shared_future来实现。std::shared_......