CSV文件的操作
map和unordered_map的区别?
共同点:
都是C++标准库提供的关联式容器,即里面放的元素都是K-V键值对,要求key是不能重复的。
给出的时间:
map是在C++98中已经存在,unordered_map是在C++11中才给出的
应用:
1.包含的头文件
2.应用的场景
只要不关心是个否有序,那么就直接使用unordered_map
接口不同,接口的实现原理不同,一个是红黑树,一个是哈希桶
哈希的基本实现与缺点:
map的迭代器可以双向移动,–>按照中序遍历的方式进行移动的,得到的是有序的序列
unordered_map只能向一个方向移动,按照同好从小到大,一条一条链表进行遍历
C++11:2011年出的C++标准,
已经使用过的C++11的特性:
1.auto:用auto定义变量时,在编译阶段,编译器会推演变量初始化表达式的类型来替换auto.不能使用auto推演函数参数类型,和数组类型
2.auto + for结合起来的范围for
3.nullptr:空值指针 C++: NULL----> 0
4.类成员变量在声明阶段可以带初始值
5.对默认成员函数的控制
语法:如果用户没有显式定义构造,拷贝构造,赋值运算符重载,析构函数,两个&,编译器会自动的生成默认成员函数
实际情况却不是这个样子的,有的时候编译器生成的默认函数意义不大,如果生成就需要调用程序,这样会影响程序的运行效率,因此有的编译器厂商 没有严格按照语法实现.
编译器生成的构造函数的场景:
1.A类具有无参 || 带有全缺省构造函数,B类没有显式定义任何构造函数,但是B类中包含有A类的对象,编译器会在编译阶段给B类生成默认的构造函数
2.继承:假设基类具有无参 || 带有全缺省的构造函数,派生类没有显式定义任何构造函数,编译器会在编译阶段给派生类生成默认的构造函数。
3.在虚拟继承中,需要在构造对象阶段将指向虚基表(偏移量表格)的指针放在对象的前四个字节
4.如果类中具有虚函数,在创建对象期间需要将虚表的地址放在对象的前四个字节
也就是说在需要生成构造函数的阶段编译器会生成默认的函数,在不需要的时候就需要看编译器厂商是咋设计的,不同的编译器厂商设计的应该是不同的。
有些情况下用户不需要生成(比如在实现unique_ptr,不需要拷贝构造函数),编译器反而生成了。而有的地方需要编译器生成,但是编译器反而不生成了(比如有了有参构造函数编译器就不再提供无参构造函数)。
正是因为有了前面的问题所以用户就有了困惑,用户不知道什么情况下编译器生成,用户也没有办法控制编译器生成(C++11以前)
C++11扩展了关键字的功能:default delete
default:告诉编译器生成默认的构造函数
Date() = default;即使用户定义了带有参数的构造函数,编译器也会生成无参的构造函数
delete:告诉编译器删除默认的成员函数,即:不生成
unique_ptr(const unique_ptr& A) = delete;//禁止编译器生成拷贝构造函数
6.C++11以前,new int[10]数组,该数组是不能在new期间进行初始化的,int p = new int[10]{1,2,3,4,5,6,7,8,9,0};*
final:
修饰类:该类不能被继承
修饰类中的函数:
只能修饰虚函数,最好让其修饰的派生类的虚函数,
作用:禁止该虚函数在其子类中被重写
final:作用举例:
8.智能指针
C++98 : auto_ptr
C++11:unique_ptr shared_ptr & weak_ptr
9.C++11引入的一些容器
序列式容器:
forward_list—>是带头结点的循环单链表
array:静态类型的顺序表
关联式容器:unordered_map/unordered_set/unordered_multimap/unordered_multiset
10.STL新增了很多的算法
11.初始化
12.变量的类型推导
auto:
decltype:
返回值类型追踪