三、容器:
3.1、基本概念:
3.1.1、关联式容器通过key 和 value 进行存储和访问, key不一定是数值(这有区别于数组,数组是通过数值下标进行访问)
3.1.2、有序(系列式)vector, deque, list
3.1.3、关联式:set, map
3.1.5、在[]重载时,用非const 版本的来调用const 版本:
MyString& operator[](size_t index) { return const_cast<MyString&>(static_cast<const MyArray&>(*this)[index])) } const MyString& operator[](size_t index) const { return data_[index]; }
3.1.6、3个new、delete和free:
1、new operator
//int* p = new int; 运算符, 相当于sizeof一样。 //会做两件事情: 1、分配内存, 2、调用构造函数。 2、operator new
//string *str = operator new(sizeof(string)); 相当于malloc; //只会分配内存,并不会去调用构造函数。 //可以被重载, //有时候我们只是需要一个空间,不掉用构造,就可以使用operator new。
3、placement new
//new((void*) __p) _T1(__value); //不分配新的内存, 是在已有的内存上构造对象。
4、operator new + placement new = new operator。
5. delete 用于释放 new 分配的空间,free 用于释放 malloc 分配的空间。
6、delete 释放空间的时候会调用相应对象的析构函数,而free不会调用析构函数。
7、new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存。
8、调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL。
9、free 和 delete 不能混用,也就是说new分配的内存空间不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放。
3.1.7、construct 创建函数,是STL规范, 是全局的。
1 template<typename _T1, typename _T2> //在已有的内存空间之上,来分配某一个对象。 2 inlin void _Construct(_T1* __p, const _T2& __value) //传进来的 *__p 我们是已经拥有所有权的。 3 { 4 new ((void*)__p) _T1(__value); //placement new 在已有的空间之上进行对象的构建。 5 }