这篇主要是集合一些初学者(就是我)遇到的一些反直觉的tips,如果大家也有遇到了的,可以一起交流
此外,笔者有一点想要扯扯淡的写在最前面,学习C++我认为有一点是非常重要的,就是不忘初心吧,听起来很扯,但是其实就是这样,学习C++其实就是看中了它的高效率,对速度处理的高效和对内存管理的高效
C++要处理的是海量的数据,和超大规模的运算,因此复杂非此不可
我们要时间控制在减少每一个重复的构造函数上,减少每一次内存申请上;要把内存节约保持在每一小块内存对齐上,每一次垃圾回收上
为何C++如此复杂,因为非此不可啊
1.关于STL容器对象的大小,使用sizeof()求得的大小是不变的
举个例子:
当我初始化一个key为int类型,value为指向Order这种类的指针的map之后,第一次输出sizeof()的结果,第二次输出sizeof的结果,是一样的,即sizeof不能直接用来测试对象的大小
std::map<int,Order*> tt = std::map<int,Order*>(); cout<< sizeof(tt)<<endl; Order* order = new Order( 1000,1000,1000 ,1000, false, false,1000); long long a = order->getOrderId(); tt.emplace(10,order); tt.emplace(9,order); tt.emplace(8,order); tt.emplace(7,order); tt.emplace(6,order); cout<< sizeof(tt)<<endl;
参考这个文章中的介绍,原因是这样的:
【类的大小不会随着成员内容器元素个数的增加而增大,容器中的元素个数增加不会增加容器变量的大小,原因是sizeof是无法求出容器所占的内存的,这些容器申请的大部分空间都是在堆上,栈上只有一部分用于管理的指针,测试得出sizeof(list)=24,sizeof(vector)=20,sizof(map)=28,这个数值和具体的编译器实现有关】
这种时候需要用到的就是
这里有几个相似的可以区分一下:
size()指 目前存在的元素数。 元素个数
capacity()指 容器能存储 数据的个数 容器 容量
reserve()指定 容器 能存储数据的个数
resize() 重新 指定 有效元素的个数 ,区别与reserve()指定 容量的大小
当创建空容器时, 容量(capacity)为 0;当用完时,增加原容量的 1/2 (各编译器 可能存在差异 vs2010是这样的,mingw则 增加原容量 )--适用如 vector这种 元素连续存储的容器, 如为list则不同。
capacity 一般大于size的原因是为了避免 每次增加数据时都要重新分配内存,所以一般会 生成一个较大的空间,以便随后的数据插入。
1.STL容器map的emplace传入对象问题
提到这个主要是为了解决一个问题,就是