C++ 基础学习5

news2024/10/6 10:37:12

C++ 基础学习5

    • std::variant
    • std::remove、erase
    • std::string::erase
    • std::filesystem
    • const和constexpr的区别
    • coreDump和异常的区别
  • 实战

std::variant

参考:https://blog.csdn.net/hang_ning/article/details/123826220
https://blog.csdn.net/janeqi1987/article/details/100568096
总结:std::variant代表了类型安全的union类型,与union类似,std::variant的一个实例要么存储了可选类型中的一个值,要么没有存储。但与union比,其优势是可以判断当前真实的存储类型并且可以存储结构体这种复杂的数据结构。
推荐使用std::get_if或者std::holds_alternative来判断std::variant变量保存的具体类型:

#include <variant>

using MyType value = std::variant<int, double, bool, std::string>;
MyType value = "hello, world";
if (std::holds_alternative<std::string>(va)) {
	std::cout << "holds std::string" << std::endl;
} else {
	std::cout << "Not holds std::string" << std::endl;
}
auto* v = std::get_if<std::string>(&value);
if (v){
   std::cout<< *v <<std::end;  //"hello, world"
}

注意:上面的代码是在运行期进行类型判断效率较低;应当尽量使用 std::visit 方法来访问,实现在编译期推断:

#include "overloaded.h"

  std::variant<int, string> value = 123;
  std::visit(overloaded{
	   void operator()(int i) { cout << "int: " << i << '\n'; }
	   void operator()(const std::string& s) { cout << "str: " << s << '\n'; }
	   },value);

  std::visit(
	  [&](auto &&arg) {
	  	using T = std::decay_t<decltype(arg)>; // 类型退化,去掉类型中的const 以及 &
	  	if constexpr(std::is_same_v<T,int>) {
	  		cout << "int: " << arg << '\n';
	  	} else if constexpr(std::is_same_v<T,std::string>){
	  		cout<< "str: "<< arg <<'\n';
	  	}
  }, value);

  std::visit(Overloaded{
           [&out](const int &val) { out << "GatewayParam{" << val << "} "; },
           [&out](const string &val) { out << "ServiceParam{" << val << "} "; },
  		 },
  value );

但是使用std::visit也有限制条件:必须把每种数据类型的处理函数都写出来;如果你只想处理其中一种参数,且对运行性能没有极致要求,那么还是在运行时进行判断吧。否则会报如下的编译失败:

type_traits:2957:11: error: no type named ‘type’ in ‘struct xxx

其它方法:
在这里插入图片描述

std::remove、erase

https://blog.csdn.net/yedawei_1/article/details/108754282
std::remove()是C++ STL中的一个算法,用于从容器中删除元素。它不会真正地删除元素,而是将要删除的元素移动到容器的末尾,并返回一个指向新的逻辑结尾的迭代器。这个迭代器之前的所有元素都是未被删除的,而之后的所有元素都是已被删除的。要真正地删除这些元素,可以使用容器的erase()函数。

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v = {4, 1, 2, 4, 3, 4, 5};
    auto new_end = std::remove(v.begin(), v.end(), 4);
    v.erase(new_end, v.end());
    for (auto i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}

输出:

1 2 3 5

std::string::erase

http://www.manongjc.com/detail/30-ozpmqwwlzpuodgn.html
可以实现删除单个字符、一段连续的字符、或者所有特定的字符。

比如,一个字符串格式如下:开头部分为"-----Begin-----\n",结尾部分为"-----End-----\n",中间除了正常内容外还有很多换行符’\n’,去掉开头部分、结尾部分、中间所有的\n:

    std::string_view beginPart = "-----Begin-----\n";
    std::string_view endPart = "-----End-----\n";

    // 去掉BEGIN部分
    std::size_t beginPos = s.find(beginPart);
    if (beginPos != std::string::npos) {
        s.erase(0, beginPart.length());
    }

    // 去掉End部分
    std::size_t endPos = s.find(endPart);
    if (endPos != std::string::npos) {
        s.erase(endPos, endPart.length());
    }

    // 去掉所有的换行符
    s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());

std::filesystem

https://blog.csdn.net/chenyijun/article/details/109263942
std::filesystem文件系统库提供了文件系统、路径、常规文件、目录等等相关组件进行操作的相关功能。

void path_use()
{
    fs::path currentPath = fs::current_path();
    //获取makefile路径  append operator/ 添加元素到带目录分隔符的路径
    fs::path makefilePath = currentPath / "Makefile.Debug"; // 路径拼接
    std::cout << "Makefile path      = " << makefilePath.string() << std::endl;
    //分解操作
    //root_name 返回路径的根名
    std::cout << "root_name          = " << currentPath.root_name() << std::endl;
    //root_directory 返回路径的根目录
    std::cout << "root_directory     = " << currentPath.root_directory() << std::endl;
    //root_path 返回路径的根路径
    std::cout << "root_path          = " << currentPath.root_path() << std::endl;
    //relative_path 返回相对根路径的路径
    std::cout << "relative_path      = " << currentPath.relative_path() << std::endl;
    //parent_path 返回亲路径的路径
    std::cout << "parent_path        = " << currentPath.parent_path() << std::endl;
    //filename 返回文件名路径组分
    std::cout << "filename           = " << currentPath.filename() << std::endl;
    //stem 返回主干路径组分
    std::cout << "stem               = " << currentPath.stem() << std::endl;
    //extension 返回文件扩展名路径组分
    std::cout << "extension          = " << currentPath.extension() << std::endl;
    std::cout << "extension          = " << makefilePath.extension() << std::endl;
 
    //查询操作
    //empty 检查路径是否为空
    std::cout << "empty              = " << currentPath.empty() << std::endl;
    //检查对应路径元素是否非空
    std::cout << "has_root_path      = " << currentPath.has_root_path() << std::endl;
    std::cout << "has_root_name      = " << currentPath.has_root_name() << std::endl;
    std::cout << "has_root_directory = " << currentPath.has_root_directory() << std::endl;
    std::cout << "has_relative_path  = " << currentPath.has_relative_path() << std::endl;
    std::cout << "has_parent_path    = " << currentPath.has_parent_path() << std::endl;
    std::cout << "has_filename       = " << currentPath.has_filename() << std::endl;
    std::cout << "has_stem           = " << currentPath.has_stem() << std::endl;
    std::cout << "has_extension      = " << currentPath.has_extension() << std::endl;
 
    //检查 root_path() 是否唯一标识文件系统位置
    std::cout << "is_absolute        = " << currentPath.is_absolute() << std::endl;
    std::cout << "is_relative        = " << currentPath.is_relative() << std::endl;
}

const和constexpr的区别

const和constexpr都是C++中的关键字,但它们的用途不同。const用于定义常量,而constexpr用于定义常量表达式。

const关键字可以用于修饰变量、函数参数、函数返回值等,表示该变量或函数返回值不可修改。

const int a = 10;
const int *p = &a;

constexpr关键字可以用于定义常量表达式,即在编译时就能计算出结果的表达式

constexpr int factorial(int n) {
    return n <= 1 ? 1 : (n * factorial(n - 1));
}

coreDump和异常的区别

C++中core dump和异常的区别是,core dump是程序在被操作系统杀掉以后,保留的一份内存快照,一般有Segmentation Fault和Abort等。
异常是指程序在运行时发生了错误,但是程序可以通过catch语句捕获并处理这个错误。

C++ core dump调试及崩溃监控
https://blog.csdn.net/hello2mao/article/details/79258471
https://blog.csdn.net/Bruce_0712/article/details/72824957
(1) 保存core dump文件

ulimit -c unlimited

(2) 利用core文件定位、调试问题

gdb 可执行程序 core

(3) 动态库的core dump调试,在CMakeList.txt中添加:

add_definitions(-D_DEBUG)
add_definitions(-DDEBUG)
add_definitions("$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

(4) 崩溃监控方案
向系统注册发生Segmentation Fault和Abort时的回调即可监控C++的崩溃:

#include <signal.h>     // ::signal
::signal(SIGSEGV, &my_signal_handler);
::signal(SIGABRT, &my_signal_handler);

在回调里就可采集崩溃栈等信息,可以使用boost库方便的记录backtrace等信息:

#include <signal.h>     // ::signal, ::raise
#include <boost/stacktrace.hpp>

void my_signal_handler(int signum) {
    ::signal(signum, SIG_DFL);
    boost::stacktrace::safe_dump_to("./backtrace.dump");
    ::raise(SIGABRT);
}

怎样让 C++ 中 throw exception 产生的 coredump 带上栈?
https://cloud.tencent.com/developer/article/1839207

如果是对已有的二进制,或者已经在运行的进程:

gdb 里面输入:

catch throw

然后运行, gdb 就会在任何 throw 的时候暂停,即可看到 throw 时候的栈。

实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot使用-基于Idea搭建WebSocket应用

文章目录 前言搭建WebSocket应用的实操流程验证总结前言 SpringBoot是所有基于Spring开发项目的起点,使得开发者能快速搭建 Spring 项目。在Idea集成工具环境下,通过使用SpringBoot,开发人员选用合适的Maven设置,能够方便地搭建WebSocket应用。 搭建WebSocket应用的实操流…

Elastic Stack

一、简介 ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;官网https://www.elastic.co/cn。包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和收集的场景&#…

推荐5款简单实用的win10小工具

今天要给大家推荐5款压箱底的宝贝软件了&#xff0c;百度搜索一下就能找到下载链接了。 1.笔记与知识管理——Evernote Evernote是一款功能强大的笔记管理工具,它可以帮助你记下生活中的点点滴滴并进行管理。这个工具拥有简洁的界面和强大的功能,可以添加文本、图片、录音、网…

tomcat maxThread 压力测试 700 并发以内最好

以前一直简单的认为多线程高效率。其实多线程本身并不能提高 cpu 效率&#xff0c;线程过多反而会降低 cpu 效率。当 cpu 核心数<线程数时&#xff0c;cpu 就需要在多个线程直接来回切换&#xff0c;以保证每个线程都会获得 cpu 时间&#xff0c;即通常我们说的并发执行。所…

基于python的WEIBO热点话题检测

微博是一个拥有海量用户的社交媒体平台&#xff0c;每天都会涌现出大量的话题和热点讨论。本文将介绍如何使用Python来实现微博热点话题检测技术&#xff0c;通过对微博文本的分析和处理&#xff0c;准确地捕捉到当前最热门的话题。 1. 数据获取 为了进行微博热点话题的检测&…

部门来了个测试开发,听说是00后,上来一顿操作给我看呆了...

公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司实习半年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&#xff01…

快速上手MATLAB:科研、工程、数据分析,MATLAB入门(上)教你基础知识!+分享MATLAB完全学习手册资料(视频+课件+代码

快速上手MATLAB&#xff1a;科研、工程、数据分析&#xff0c;MATLAB入门&#xff08;上&#xff09;教你基础知识&#xff01; 福利&#xff1a;文末有资料分享&#xff01;&#xff01; 前言零基础的人学matlab&#xff0c;需要哪些基础知识&#xff1f; 一、认识MATLAB1. MA…

【Flutter 工程】001-Flutter 状态管理:Riverpod

【Flutter 工程】001-Flutter 状态管理&#xff1a;Riverpod 文章目录 【Flutter 工程】001-Flutter 状态管理&#xff1a;Riverpod一、概述1、官方状态管理2、状态管理解决方案3、为什么选择 RiverpodRiverpod 官方文档Riverpod 提供的几种 Provider 二、官方示例1、安装2、官…

Linux中vim编辑器

目录 Linux中vim编辑器 学习vim的原因 vim的三种模式 命令模式 输入模式 末行模式 模式切换方法 模式的常用命令 命令模式 --- 光标移动 命令模式 --- 赋值、粘贴、删除 命令模式 --- 文件内容查找 命令模式 --- 撤销编辑及保存退出 末行模式 --- 保存文件及退出vi…

探究企业角色权限管理的重要性及实践方法

角色权限管理是企业网盘工具中的重要功能。它是指将特定角色分配给用户&#xff0c;然后根据用户的工作要求为这些角色分配访问权限的过程。通过使用基于角色的权限&#xff0c;组织可以确保员工只能访问执行工作职责所需的文件和文件夹。那么企业角色权限管理有必要吗&#xf…

提高测试效率,用封装自动化框架实现Web页面自动滚动!

目录 前言&#xff1a; 一、什么是Web自动化框架&#xff1f; 二、为什么需要封装&#xff1f; 三、自动页面滚动功能实现原理 四、封装代码实现 五、总结 前言&#xff1a; Web自动化是现代软件开发过程中的重要组成部分&#xff0c;为了提高开发效率&#xff0c;开发人…

【限时开放!99元交个朋友】ChatGPT AIGC研讨社拉新!

前言 不知道你是否有这样的困惑&#xff1a;想探索ChatGPT的奥秘&#xff0c;却不知道如何入手&#xff1f;想让ChatGPT助力学习工作&#xff0c;却不知如何调教&#xff1f;想在AI浪潮中勇立潮头&#xff0c;却找不到学习路径&#xff1f;怀揣创新想法&#xff0c;却不知如何…

【广州华锐互动】数字孪生编辑器:简单高效的可视化管理系统编辑工具

广州华锐互动开发的数字孪生编辑器&#xff0c;是一款基于数字孪生技术的可视化建模工具&#xff0c;通过将现实世界中的对象数字化&#xff0c;以虚拟现实的方式展现在计算机屏幕上&#xff0c;使用户可以进行模拟、预测和优化实际场景中的操作。 数字孪生编辑器已在工业、建…

【博士论文latex写作】

1.安装编译器 到官网下载镜像&#xff1a;https://mirrors.hit.edu.cn/CTAN/systems/texlive/Images/ 选择 texlive2023.iso 也可选择百度云2022版本&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WLVX8Zn1E4hIYRupLBabNA?pwdgm63 提取码&#xff1a;gm63 打开后…

8.防火墙-SNAT和DNAT

文章目录 SNAT-内网客户访问外网服务原理操作实验 DNAT-外网客户访问内网服务原理操作实验 tcpdump SNAT-内网客户访问外网服务 原理 由内网到外网&#xff1a;从内网发到外网的数据包的源IP由私网IP转换成公网IP 由外网到内网&#xff1a;从外网发到内网的数据包的目的IP由公…

自动驾驶成为汽车产业未来趋势,连接器行业迎来进一步发展

连接器的应用范围越来越广泛&#xff0c;从汽车、工业、医疗、消费电子、通信、计算机到航空航天&#xff0c;几乎所有的领域都使用连接器。 以汽车行业为例&#xff0c;一辆燃油汽车通常需要几百到上千个连接器&#xff0c;而电动汽车则需要更多&#xff0c;因为需要连接电池…

iptables防火墙(二)

iptables防火墙&#xff08;二&#xff09; 一、SNAT策略1、SNAT策略简述2、配置实验 二、DNAT策略1、DNAT策略简述2、配置实验 三、Linux抓包工具tcpdump四、防火墙规则保存 一、SNAT策略 1、SNAT策略简述 SNAT策略就是将从内网传给外网的数据包的源IP由私网IP转换成公网IP&…

软考——邻接矩阵

数组(邻接矩阵)表示法 建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。 设图A=(V,E)有n个顶点,则图的邻接矩阵是一个二位数组A.arcs[n][n],定义为:

【现场问题】oracle,schema = metaData.getConnection().getSchema()报错

oracle获取Schema报错 问题描述折磨我的地方版本的问题 jar冲突 问题描述 折磨我的地方 版本的问题 ojdbc8&#xff0c;问题是我一直都是这个版本&#xff0c;我换了大小版本都不可以&#xff01;&#xff01;&#xff01;&#xff01; jar冲突 我怎么找得到这个jar的冲突呢…

06 Android开机启动之Bootanimation

Android开机启动之Bootanimation 前言 手机或其他Android智能终端开机都会先显示一个动画,然后才进入桌面,接下来看看这个bootanimation程序是怎么跑的 一、bootanimation框图 从上面的启动框图中可以看出: bootanimation也是init进程启动的,在init.rc中启动bootanim进程启…