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 }
时间: 2024-12-15 04:13:52

stl_container容器的相关文章

stl_container容器和std_algorithm算法相同的函数

八.算法和容器中存在的功能相同的函数: 8.1.array: 8.1.1.fill. 1.在array中:void fill (const value_type& val); 2.在algorithm中: template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val); 8.1.2.swap. 1.在array中: vo

Docker学习笔记——Mongo Dockerfile及容器运行

1.创建项目目录mongo,在目录下上传下载的Mongodb安装文件及mongo.conf配置文件,创建Dockerfile文件,项目结构如下: mongo - Dockerfile - mongo.conf - mongodb-linux-x86_64-3.4.9.tgz - data - logs Dockerfile内容如下: # mongo # SOURCE_IMAGE FROM centos # MAINTAINER_INFO MAINTAINER bluemooder [email 

spring父子容器

通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的id必须是唯一的,但子容器可以拥有一个和父容器id相同的Bean.父子容器层级体系增强了Spring容器架构的扩展性和灵活性,因为第三方可以通过编程的方式,为一个已经存在的容器添加一个或多个特殊用途的子容器,以提供一些额外的功能. Spring使用父子容器实现了很多功能,比如在Spring MVC中

java持有对象【2】ArrayList容器续解

此为JDK API1.6.0对ArrayList的解释. ArrayList 使用java泛型创建类很复杂,但是应用预定义的泛型很简单.例如,要想定义用来保存Apple对象的ArrayList,可以声明ArrayList<Apple>,尖括号内为类型参数,(可以为多个).它指定了容器可以保存的类型. 通过使用泛型,可以在编译期防止将错误类型的对象放置到容器中. ArrayList向上转型为List. 应该注意到,在将元素从List中取出时,类型转换不是必须的了.因为List在调用get()时会

width:100%与绝对定位同时存在,偏移出父级容器

当父级容器内的子元素width设为100%,而子元素又有绝对定位时,子元素伸展超出父级容器,像下面 出现这种情况的原因,width:100%,这个百分之百是相对其定位父级而言的,其定位父级有多宽,这个子元素就有多宽,所以子元素跑到了父级容器外 html <div class="container"> <div class="content">好的</div> </div> css .container { positi

【Docker常见问题2】如何设置容器日志大小和保留个数

举例:当tomcat容器的运行,容器占用空间越来越大,约1个月就会超过2G,如何解决? 步骤1:查看容器日志大小:假设容器目录为/var/lib/docker/containers,那么执行如下命令 cd /var/lib/docker/containers  #进入默认容器空间目录 du -sh *            #统计文件大小2.4G  de92a5643f7ffb106f8abba21fc0f93996842917a52879153adc95a73312934a-json.log

Vector容器 和 iteration 迭代器

vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库负责管理存储元素的相关内存.我们把vector称为容器,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的. 使用vector之前,必须包含相应的头文件.#include <vector> using std::vector; vector是一个类模板(class template).模板允许程序员编写单个类或函数定义,这个类和函数定义可用于不同的数据类型上.

架构师养成--7.同步类容器和并发类容器

一.同步类容器 同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作.复合类操作如:迭代(反复访问元素,遍历完容器中的所有元素).跳转(根据指定的顺序找到当前元素的下一个元素).以及条件运算.这些复合操作在多线程并发的修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器设计的时候并没有考虑并发修改的问题. 同步类容器:如古老的Vector/HashTable.

vector容器用法详解

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化. vector类常用的函数如下所示: 1.构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元