![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
标准C/C++
文章平均质量分 84
liuyuan185442111
主要为了增强记忆和方便查询,评论如果没有及时回复,还请见谅
展开
-
c++的map的内存布局
最后end()指向的是_M_header,其数据部分正好从_M_node_count的位置开始,it->first正好是_M_node_count的位置,it->second则是p的低4字节。有一个指针偶尔会置成0xffffffff,大佬查了几天发现是由于对map的end迭代器进行了错误操作导致的。_Rb_tree_key_compare里有一个_Compare类型的成员变量,std::less没有成员变量,如果使用默认的内存分配器,_Node_allocator里没有成员变量,不占空间。原创 2024-01-06 20:09:30 · 725 阅读 · 0 评论 -
printf迷思
一直大概清楚c语言里可变参数的原理(参考C标准库参考指南(上)),所以我在使用printf的时候,都会让格式说明和参数类型严格对应,比如:printf("%llu %d", 8llu, 5);这当然没问题,但有时候发现没对应的时候,不理解printf的实际输出:unsigned long long m = 17179869187; //0x400000003printf("%d %d", m, 9); //3 9 我以为应该是3 4printf("%llu %d", 8, 5, 6); //原创 2022-01-23 22:44:35 · 722 阅读 · 0 评论 -
c++单元测试框架Catch2的简单使用
Catch2是一个简单的c++单元测试框架,v2版本基于c++11开发,v3版本需要c++14及以上,最初版本Catch1.x基于c++98。项目地址是 Catch2 或 镜像。Catch2简单易用,v2版本只需要下载catch.hpp,先选择v2.x分支,路径是single_include/catch2/catch.hpp,主分支当前是v3版本,将extras目录下的catch_amalgamated.hpp和catch_amalgamated.cpp下载,包含到你的工程就可以了。Catch2不依赖原创 2021-09-20 16:55:33 · 4096 阅读 · 0 评论 -
c++的复制省略(copy elision)
学习 A simple C++11 Thread Pool 时,发现函数返回了std::future,而std::future的拷贝构造和拷贝赋值都是delete的,感觉有点怪,查了一下,看到 编译器优化之Copy elision、URVO、NRVO 后恍然大悟。这里做一下总结整理。复制省略或者译作省略不必要的复制(copy elision),是C++语言标准中定义的编译优化技术。当一个class类型的临时对象用于初始化同类型的对象时,复制初始化通常优化为直接初始化。GCC的编译选项-fno-elid原创 2021-08-28 17:36:03 · 1712 阅读 · 1 评论 -
gcc的std::list::size()时间复杂度是O(n)的
最近用到了std::list,程序运行奇慢,发现是size()费时很多,看了cplusplus.com,说c++98可以是线性复杂度,c++11是常数复杂度,然而看了看代码,gcc并没有完全遵循标准: /** Returns the number of elements in the %list. */ size_type size() const { return std::distance(begin(), end()); }想起当时在gcc4.8原创 2020-11-19 20:10:22 · 608 阅读 · 0 评论 -
std::rotate的几种实现方法
《编程珠玑》2.3节提出了向量旋转问题,并给出几种解决方案。c++标准库中的template <class ForwardIterator>void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last)就解决了该问题,而且一般来说使用了其中效率最高的方法。接下来就分别看一下这几个解...原创 2019-11-25 23:14:33 · 1331 阅读 · 0 评论 -
关于std::map的节点大小
项目中需要用到很大的map,于是想看一下map本身的存储消耗是多少,于是写了个最简单的allocator来试。 以下MyAlloc的默认构造、(广义的)复制构造、rebind是必需的,为了查看分配空间的大小,allocate也是必需的。 用greater<int>()显式的构造map是为了说明,“c++尽可能将语句解释为函数声明”,语句map<int,int,greate...原创 2018-04-24 11:26:20 · 2905 阅读 · 0 评论 -
再探reverse_iterator和iterator的关系
...原创 2017-08-06 11:34:30 · 692 阅读 · 0 评论 -
选择删除STL标准容器元素的方法
删除容器中有特定值的所有元素: 如果容器是vector、string、deque,则使用erase-remove用法 如果容器是list,则使用list::remove 如果容器是一个标准关联容器,则使用它的erase成员函数删除容器中满足特定条件的所有元素: 如果容器是vector、string、deque,则使用erase-remove_if用法 如果容器是list,则使用lis...原创 2017-03-22 15:02:52 · 737 阅读 · 0 评论 -
两种字符串比较方法
c++中在将字符串做为map的key时,或对字符串进行排序时,需要提供比较方法,如果使用的是string,可以不用指定比较方法,因为标准库为basic_string定义了bool operator< (const string& lhs, const string& rhs);,最终调用的是strcmp方法,然而有时候我们可能需要不一样的排序方式。下面提供了两种比较方法,co...原创 2018-11-07 19:14:28 · 5164 阅读 · 0 评论 -
关于main函数的参数
历史上大多数UNIX系统支持main函数带有三个参数:int main(int argc, char *argv[], char *env[]);其中第二个参数是参数表的地址,第三个参数就是环境表的地址,它们都是一个字符指针数组,每个指针指向一个以null结束的C字符串。 另外全局变量environ也包含了环境表指针数组的地址:extern char **environ;因为...原创 2018-04-21 18:46:28 · 250 阅读 · 0 评论 -
确定类型和表达式在编译期信息的模板技术
...原创 2017-08-06 12:53:11 · 561 阅读 · 1 评论 -
c++的异常
...原创 2015-05-25 22:50:33 · 547 阅读 · 0 评论 -
C标准库参考指南(上)
c标准库参考指南 A guide to the stranded C library本指南主要基于《C标准库》(P.J.Plauger,2009-7-1,人民邮电出版社),在用到c标准库的时候可以用来做一个参考,同时本指南也有部分实现细节。由于时间和精力有限,很多方面被忽略掉了,比如硬件相关部分、区域化设置、大部分数学函数、内存分配算法、宽字符和多字符部分、其他复杂的算法等。原创 2015-02-09 18:04:20 · 1589 阅读 · 0 评论 -
C标准库参考指南(下)
下节包括stdio.h,string.h,time.h和另外一些东西。 上节链接 http://blog.csdn.net/liuyuan185442111/article/details/43673461输入输出流(stdio.h)此头文件最常用,也很复杂。它包含3种类型、一些宏和很多的执行输入输出的函数。声明的类型有size_t,FILE,fpos_t。 FILE是一个结构...原创 2015-02-10 12:08:51 · 1211 阅读 · 0 评论 -
结构体和类的大小问题
...原创 2015-05-26 22:37:21 · 550 阅读 · 0 评论 -
读几本c++书的记录
...原创 2017-08-06 13:31:33 · 507 阅读 · 0 评论 -
c++的RTTI和类型转换操作符
...原创 2015-05-28 19:36:29 · 709 阅读 · 0 评论 -
探索c++的new和delete
...原创 2017-08-08 21:31:05 · 355 阅读 · 0 评论