STL容器共性机制

原创 2018年04月16日 19:33:16
STL 容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝。
1、除了 queue 和 stack 之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
2、通常 STL 不会抛出异常,需要使用者传入正确参数。
3、每个容器都提供了一个默认的构造函数和默认的拷贝构造函数。

4、大小相关的构造方法: ① size()返回容器中元素的个数 ② empty()判断容器是否为空

先看下面一段代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
class Person{
public:
	Person(char* name,int age){
		this->pName = new char[strlen(name) + 1];
		strcpy(this->pName,name);
		this->mAge = age;
	}
	~Person(){
		if (this->pName != NULL){
			delete[]this->pName;
		}
	}
public:
	char* pName;//容易出现浅拷贝的问题
	int mAge;
};
void test01(){
	Person p1("AAA",22);
	vector<Person> v1;
	v1.push_back(p1);
}
int main(void)
{
	test01();
	system("pause");
	return 0;
}

对象中的成员包含了指针,这样就容易引发浅拷贝的问题,因为向容器内部存放元素的时候,容器只是做了简单的值拷贝,并没有做深拷贝动作,导致对象指向的内存和容器中浅拷贝的对象所指向的内存被释放两次,导致了错误:



原因在于两个指针指向了同一块堆区内存,这样会导致不可预知的结果,函数结束其中一个调用析构函数,销毁了data指向的内存空间,而另一个对象析构的时候就会挂掉。
问题的解决办法就是,给我们的对象提供一个拷贝构造函数,并且重载=操作符,两个指针分别指向自己的那一块内存,互不影响。避免这种问题的最好方式就是自己给出拷贝构造函数并且重写等号操作符:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
class Person{
public:
	Person(char* name,int age){
		this->pName = new char[strlen(name) + 1];
		strcpy(this->pName,name);
		this->mAge = age;
	}
	//拷贝构造函数
	Person(const Person& other){
		this->pName = new char[strlen(other.pName) + 1];
		strcpy(this->pName, other.pName);
		this->mAge = other.mAge;
	}
	//重载等号操作符
	Person& operator=(const Person& other){

		if (this->pName != NULL){
			delete[]this->pName;
		}
		 
		this->pName = new char[strlen(other.pName) + 1];
		strcpy(this->pName, other.pName);
		this->mAge = other.mAge;
		return *this;
	}
	~Person(){
		if (this->pName != NULL){
			delete[]this->pName;
		}
	}
public:
	char* pName;//容易出现浅拷贝的问题
	int mAge;
};
void test01(){
	Person p1("AAA",22);
	vector<Person> v1;
	v1.push_back(p1);
}
int main(void)
{
	test01();
	system("pause");
	return 0;
}


这样的话就算发生了拷贝动作,容器执行的也是深拷贝,不会发生对同一块内存连续释放两次的情况!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38032942/article/details/79964864

C++ 学习笔记:STL 容器一些底层机制

vector 容器 list 容器 deque 容器 stack queue heap priority_queue set 和 multiset 容器 map 和 multimap 容器 hash_...
  • TQH_Candy
  • TQH_Candy
  • 2016-08-31 18:36:22
  • 1743

STL学习笔记-容器的共性机制

容器的共通的能力: (1) C++容器都是使用C++模板进行实现的。 (2) 理论提高:所有容器提供的都是值语意,而不是引用语意。容器执行插入元素的操作时,内部实现的是拷贝动作。 所以STL容器...
  • tangwei2014
  • tangwei2014
  • 2015-10-21 23:08:24
  • 1261

STL - 容器共性机制研究

C++模板是容器的概念。 理论提高:所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须...
  • zyq522376829
  • zyq522376829
  • 2015-07-08 21:59:13
  • 468

STL中容器的底层实现原理

 在STL中基本容器有: vector、list、deque、set、map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set:集合, 用来判断某一个元素...
  • aa838260772
  • aa838260772
  • 2014-09-30 11:05:23
  • 3409

STL中各个容器的实现基本原理以及互相依赖

STL中一共拥有六大组件: 1.算法 2.迭代器 3.容器. 4.仿函数 5.适配器(配接器)6.空间配置器 通过阅读侯捷版本的《STL源码剖析》可以知道,STL的实现也是由基本的数据结构...
  • hiyajo_salieri
  • hiyajo_salieri
  • 2017-03-05 20:28:48
  • 339

STL的增长机制、以及内存释放机制

Vector是STL中最常见的容器,它占用的是一块连续分配的内存,从数据存储角度来讲,和数组极其相似,不同的是:数组是静态分配空间,一旦分配了空间的大小就不可以再改变了,而VECTOR是动态分配空间,...
  • sinat_24520925
  • sinat_24520925
  • 2015-03-20 10:07:15
  • 1541

使用STL中的list容器实现单链表的操作

#include #include #include using namespace std; void Print(int &item) { cout
  • adminabcd
  • adminabcd
  • 2015-06-27 16:59:35
  • 1041

容器共性机制研究

理论提高: 所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。 所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)...
  • bbs375
  • bbs375
  • 2016-09-30 08:22:15
  • 110

stl之map容器的原理及应用

容器的数据结构同样是采用红黑树进行管理,插入的元素健位不允许重复,所使用的节点元素的比较函数,只对元素的健值进行比较,元素的各项数据可通过健值检索出来。map容器是一种关联容器,实现了SortedAs...
  • u010418035
  • u010418035
  • 2015-07-05 12:21:47
  • 7805

C/C++知识要点2——STL中Vector、Map、Set容器的实现原理

1、Vector是顺序容器,是一个动态数组,支持随机存取、插入、删除、查找等操作,在内存中是一块连续的空间。在原有空间不够情况下自动分配空间,增加为原来的两倍。vector随机存取效率高,但是在vec...
  • TommyZht
  • TommyZht
  • 2015-08-06 10:40:06
  • 4154
收藏助手
不良信息举报
您举报文章:STL容器共性机制
举报原因:
原因补充:

(最多只允许输入30个字)