c++
zmhzmhzm
Life can only be understood backwards; but it must be lived forwards.
展开
-
C++ noexcept关键字详解
noexcept是c++11新引入的关键字,取代c++98的throw()的异常规格,虽然c++的异常规格被大家嫌弃并弃用,但将一定不会发出异常的函数申明成noexcept还是能一定程度上带来代码效率的提升。原创 2024-03-22 17:06:35 · 589 阅读 · 0 评论 -
C++源码剖析push_back和emplace_back的区别
【代码】源码剖析push_back和emplace_back的区别。原创 2024-03-19 15:41:22 · 200 阅读 · 0 评论 -
C++ inline关键字总结
inline只是对编译器的建议,编译器不一定采纳inline会省去函数调用的开销,同时还可以帮助编译器优化代码inline会造成代码膨胀,消耗内存template和inline是两个概念,彼此互不影响,在template函数加inline的话,就是具现出来的每个函数都是inline的在类的成员函数声明里直接定义函数的话,会隐式inlineinline会使virtual函数落空,因为virtual意味着执行后决定调用,而inline表示执行前替换构造函数和析构函数不要inline,因为这两个函数原创 2024-03-05 16:37:30 · 287 阅读 · 0 评论 -
c++ [[nodiscard]]关键字详解
如果一个函数声明了[[nodiscard]],则该函数的返回值不能没有承接,如果没有承接,就会编译报warning原创 2024-03-01 10:21:24 · 584 阅读 · 0 评论 -
编译报错 terminate called after throwing an instance of ‘std::length_error‘ what(): vector::_m_range_ins
terminate called after throwing an instance of 'std::length_error' what(): vector::_m_range_insert原创 2024-02-22 15:19:33 · 495 阅读 · 0 评论 -
c++指针和引用的区别
个人认为一个函数中,如果涉及传入参数的修改,那么最好把这个被修改值设计成指针接口,因为这样在下游调用函数时,就知道哪个参数会被修改,代码可读性更好。涉及型别推导时,例如模板推导或auto推导的情况,指针会被推导出指针型别,并保留cv特性。但引用只会被推导成值型别,且不保留cv特性。操作符,在返回类型时应该使用引用,而不使用指针。指针可以被重新赋值指向另一个不同对象,但是引用总是指向在初始化时被指定的对象,以后不能改变。指针指向了一个对象的地址,引用是给一个对象起别名。一些惯用语境下,例如重载。原创 2024-02-18 17:42:07 · 368 阅读 · 0 评论 -
C++使用宏定义时的歧义问题
【代码】C++使用宏定义时的歧义问题。原创 2023-02-01 19:13:14 · 176 阅读 · 0 评论 -
c++ stl常用算法总结
将容器中满足条件的放在一边, 不满足条件的放在另一边, 返回两边中间另一边开始前的指针, 会改变容器顺序。去除容器中满足特定条件的元素, 通常与erase联合使用, 完成真正意义上的删除, 不要求容器有序。将容器中的[first, middle)元素进行排序, 会改变容器顺序, 默认从小到大排序。找到容器中第一个大于等于一个值的元素, 不会改变容器顺序, 要求容器有序。找到容器中第一个大于一个值的元素, 不会改变容器顺序, 要求容器有序。将容器元素进行排序, 会改变容器顺序, 默认从小到大排序。原创 2022-12-20 14:01:45 · 388 阅读 · 0 评论 -
如何去除const成员函数的const属性
【代码】原创 2022-11-19 13:04:30 · 524 阅读 · 0 评论 -
find_package()快速理解
find_package()快速理解原创 2022-10-24 19:14:06 · 3362 阅读 · 0 评论 -
一文读懂emplace_back和push_back的最主要区别
案例假设给定A类, 代码如下#include <iostream>#include <vector>class A { public: A() { std::cout << "默认构造" << this << std::endl; } A(const A&) { std::cout << "拷贝构造" << this << std::endl; } A(A&&) {原创 2021-10-27 13:40:20 · 601 阅读 · 0 评论 -
error: non-const lvalue reference to type cannot bind to a value of unrelated type
项目场景:在项目代码编译中报错信息如下:error: non-const lvalue reference to type '...' cannot bind to a value of unrelated type '...'问题描述:将项目问题进行简单抽象后等价于以下问题:这样做编译通过 int a; const double& m = a;但这样做编译报错 int a; double& m = a;报错信息如标题原因分析:因为临时变量不能被绑定在一个原创 2021-10-24 13:20:28 · 4297 阅读 · 1 评论 -
std::async和std::thread的区别
std::thread是强行创建一个线程, 而std::async是声明一个异步任务std::async可以容易的获得线程函数的结果, 使用方法为:std::future<int> result = std::async(mythread);std::out << result.get() << std::endl;std::async的缺省参数(默认参数)是std::launch::deferred | std::launch::async, 表示系统自动判.原创 2020-07-05 16:55:03 · 891 阅读 · 0 评论 -
C++ map容器插入具有相同键的键值对的覆盖问题
map容器插入键值对的方法一般有两种map["key"] = value;map.insert(make_pair<>("", ""));使用方法一插入相同键的键值对时,后一组的键值对会覆盖前一组键值对。代码如下:#include <map>#include <iostream>using namespace std;int main(){ map<double, double> mp1; mp1[1.0] = 1.1; m原创 2020-09-14 21:05:06 · 6906 阅读 · 0 评论 -
C++标准库“类线性表容器”(vector, list, deque, stack, queue)对比详解
std::vector数据结构: 线性表存储结构: 顺序存储结构特性:可快速存取表中任意位置的元素,存取时间复杂度为O(1)在末尾插入和删除的效率高,时间复杂度为O(1)当添加的数据超过vector的capacity时要进行内存的重新分配、拷贝与释放,这个操作非常耗时,建议在创建vector 时就指定其空间大小在表中除末尾处插入删除值时效率很低,时间复杂度为O(n),一般原则上不允许在vector除末尾外的地方进行插入删除操作std::list.原创 2021-02-02 19:37:17 · 852 阅读 · 0 评论 -
C++类中默认生成的函数详解
C++类中会在需要时(即在某些代码使用了它们, 而类中并未显式申明的场合), 会默认生成一些public属性的函数C++98标准: 会生成默认构造函数, 析构函数, 复制构造函数, 复制赋值运算符C++11标准: 除了C++98标准中生成的函数外, 还会生成移动构造函数和移动赋值运算符以类A为例, 上述函数表示如下:Class A { public: A() = default; // 构造函数 ~A() = default;原创 2021-10-15 15:09:02 · 1342 阅读 · 0 评论