stl_container容器

三、容器:

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 }
posted @ 2017-04-29 10:13  _xiaohaige  阅读(213)  评论(0编辑  收藏  举报