随笔分类 -  C++

C++知识记录
摘要:1) 源码编译及安装 获取源码 gitclonehttps://github.com/jbeder/yamlcpp.git cd yaml-cpp && mkdir build && cd build && cmake .. && make && make install 使用样例: 阅读全文
posted @ 2023-08-09 19:28 PKICA 阅读(353) 评论(0) 推荐(0) 编辑
摘要:STL容器不是线程安全的。对于vector,即使写方(生产者)是单线程写入,但是并发读的时候,由于潜在的内存重新申请和对象复制问题,会导致读方(消费者)的迭代器失效。实际表现也就是招致了core dump。另外一种情况,如果是多个写方,并发的push_back(),也会导致core dump。 解法 阅读全文
posted @ 2022-02-06 16:45 PKICA 阅读(35) 评论(0) 推荐(0) 编辑
摘要:代表一串元素, 或者一串元素中的一段 类似 begin/end 对 好处: 简化语法和方便使用 vector<int> data{11, 22, 33}; sort(begin(data), end(data)); sort(data); // 使用 Ranges 防止 begin/end 不配对 阅读全文
posted @ 2021-11-05 14:43 PKICA 阅读(301) 评论(0) 推荐(0) 编辑
摘要:概念(concept) 使用模板进行通用编程的关键思想是定义能通过各种类型(type)使用的函数和类。但是,在实例化模板时经常会出现用错类型的问题,其结果通常是几页难懂的报错信息。 现在概念来了,这个问题可以休矣。概念让你能为模板编写要求,而编译器则可以检查这个要求。概念革新了我们思考和编写通用代码 阅读全文
posted @ 2021-11-05 14:40 PKICA 阅读(867) 评论(0) 推荐(1) 编辑
摘要:STL各种容器和算法的sort和find函数对重载运算符的调用情况: 1) 二叉树类型的容器的sort和find都会调用operator < 。 2)线性类型容器sort会调用operator <;线性容器使用std::find会调用operator ==。 需要非常注意重载<运算符,分类讨论要周全 阅读全文
posted @ 2021-06-11 16:53 PKICA 阅读(140) 评论(0) 推荐(0) 编辑
摘要:例1:int f(){ int i = 1; return i;}int main{ int r = f();}在例1的程序中,由于f()函数返回的是int类型,在函数结束时,要返回的值已经用于初始化函数的调用点的临时量了(假设为temp,在main(调用者)中),函数执行完后,i确实是被销毁了,但 阅读全文
posted @ 2021-06-03 15:28 PKICA 阅读(317) 评论(0) 推荐(0) 编辑
摘要:C++标准的规定:非常量的引用不能指向临时对象 为了防止给常量或临时变量(只有瞬间的生命周期)赋值(易产生bug),只许使用const引用之。 概括一下: 不能把临时对象作为实参传给非const引用。 例如: void conv(string &str) { } int main() { conv( 阅读全文
posted @ 2021-06-02 09:46 PKICA 阅读(120) 评论(0) 推荐(0) 编辑
摘要:C++20加入协程,其实是为了以后加入网络库而准备的。协程也是异步执行的,那么它跟std::thread有什么区别呢?区别在于协程是用户调度的,线程则是系统调度的。由于是用户态的,所以协程数量是不受限制的,想要多少就创建多少。同时C++20的协程是无栈协程,在调度切换时性能比线程快很多。基于协程的特 阅读全文
posted @ 2021-04-20 20:29 PKICA 阅读(79) 评论(0) 推荐(0) 编辑
摘要:优点没有头文件声明实现仍然可分离, 但非必要可以显式指定那些导出(类, 函数等)不需要头文件重复引入宏 (include guards)模块之间名称可以相同不会冲突模块只处理一次, 编译更快 (头文件每次引入都需要处理)预处理宏只在模块内有效模块引入顺序无关紧要 创建模块// cppcon.cpp 阅读全文
posted @ 2021-04-20 20:26 PKICA 阅读(1307) 评论(0) 推荐(0) 编辑
摘要:一.如果只是简单地解决在多线程中对共享资源的读写并发问题,只需要用C++以下内容: 线程类 thread, 原子数据类模板 atomic<T> t, 互斥 mutex, 锁 lock, 条件变量 condition_variables. 二.在此基础上,如果想在并行编程中获得更好的性能,尤其当使用的 阅读全文
posted @ 2020-01-06 20:27 PKICA 阅读(69) 评论(0) 推荐(0) 编辑
摘要:1. optional的作用 类模板 std::optional 管理一个可选的容纳值,即可以存在也可以不存在的值。 一种常见的 optional 使用情况是一个可能失败的函数的返回值。与其他手段,如 std::pair<T,bool> 相比, optional 良好地处理构造开销高昂的对象,并更加 阅读全文
posted @ 2019-11-02 16:58 PKICA 阅读(222) 评论(0) 推荐(0) 编辑
摘要:#include<stdio.h> #include<stdlib.h> #include<iostream> #include<iomanip> using namespace std; class A { public: int m_data1; int m_data2; void func1( 阅读全文
posted @ 2019-10-24 20:11 PKICA 阅读(45) 评论(0) 推荐(0) 编辑
摘要:绝对不编码的,仅仅有字母、数字、短横线(-)、下划线(_)、点(.)和波浪号(~),其它字符要视情况而定。所以一般性的urlencode仅仅需保留上述字符不进行编码。 阅读全文
posted @ 2019-10-07 16:08 PKICA 阅读(624) 评论(0) 推荐(1) 编辑
摘要:目前成熟的日志系统有很多,比如log4cxx,log4cpp等,今天一起来学习log4cxx吧,之所以学习这个,首先,这个日志库比较成熟,一直由apach基金在维护,而log4cpp缺乏维护.再者,这个库的性能相对高一些,大约为10w行/s. log4cxx依赖于apach的另外两个开源库apr和a 阅读全文
posted @ 2019-09-08 22:41 PKICA 阅读(1634) 评论(0) 推荐(0) 编辑
摘要:C++11中大部分的容器对于添加元素除了传统的 insert 或者 pusb_back/push_front 之外都提供一个新的函数叫做 emplace。 比如如果你想要向 std::vector 的末尾添加一个数据,你可以: std::vector<int> nums;nums.push_back 阅读全文
posted @ 2019-08-22 20:06 PKICA 阅读(5745) 评论(0) 推荐(1) 编辑
摘要:/** @file packaged_task.cpp * @note * @brief * @author * @date 2019-8-15 * @note * @history * @warning */ // packaged_task example #include <iostream> // std::cout #include <future> // std::packaged_t 阅读全文
posted @ 2019-08-15 21:10 PKICA 阅读(312) 评论(0) 推荐(1) 编辑
摘要:future和promise的作用是在不同线程之间传递数据。使用指针也可以完成数据的传递,但是指针非常危险,因为互斥量不能阻止指针的访问;而且指针的方式传递的数据是固定的,如果更改数据类型,那么还需要更改有关的接口,比较麻烦;promise支持泛型的操作,更加方便编程处理。 假设线程1需要线程2的数 阅读全文
posted @ 2019-08-15 21:09 PKICA 阅读(13779) 评论(1) 推荐(9) 编辑
摘要:std::ref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。 std::r 阅读全文
posted @ 2019-08-08 20:38 PKICA 阅读(4425) 评论(0) 推荐(3) 编辑
摘要:普通new一个异常的类型std::bad_alloc。这个是标准适应性态。 在早期C++的舞台上,这个性态和现在的非常不同;new将返回0来指出一个失败,和malloc()非常相似。 在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL。 在一定的环境下,返回一个NU 阅读全文
posted @ 2019-05-17 20:01 PKICA 阅读(2307) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示