8-2 容器分类,array、vector容器精解

001容器分类和array容器的使用

#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>
#include <memory>
#include <array>
using namespace std;


int main(void)
{
	//包含5个元素的数组
	array<string, 5>mystring = { "fsdfd","fsfds","ds","dsf","dfd" };
	cout << mystring.size() << endl;//5
	mystring[0] = "fsdffffsdfsdfsdfsdfsfsfdf";
	cout << sizeof(string) << endl;//字符串类型的大小---28
	for (size_t i=0;i<mystring.size();i++)
	{
		cout << "------------------------------1" << endl;
		const char*p = mystring[i].c_str();
		cout << "元素内容为:" << p << endl;
		printf("对象地址为=%p", &mystring[i]);
		cout << endl;
		printf("指向的字符串地址=%p", p);
		cout << endl;
		cout << "------------------------------2" << endl;

	}
	
	/*
			 ------------------------------1
			元素内容为:fsdffffsdfsdfsdfsdfsfsfdf
			对象地址为=002EFB60
			指向的字符串地址=0063DA38
			------------------------------2
			------------------------------1
			元素内容为:fsfds
			对象地址为=002EFB7C
			指向的字符串地址=002EFB80
			------------------------------2
			------------------------------1
			元素内容为:ds
			对象地址为=002EFB98
			指向的字符串地址=002EFB9C		//string 比较短,直接在后面存储
			------------------------------2
			------------------------------1
			元素内容为:dsf
			对象地址为=002EFBB4
			指向的字符串地址=002EFBB8
			------------------------------2
			------------------------------1
			元素内容为:dfd
			对象地址为=002EFBD0
			指向的字符串地址=002EFBD4
			------------------------------2
			请按任意键继续. . .


	 */
	//总结:对象是连续的,但是对象指向的字符串的内存空间没有关系
	
	
	system("pause");
	return 0;
}

/*
*(1)容器的分类
*vector
*list
*map
*容易用于保存数据,
*STL中的容器可以分为3大类
*	1.顺序容器(Sequence containers),放在那里就在那里,array,vector,deque ,list, Forward-List
*	2.关联容器(Associative Containers),元素一般是hi键值对,使用键(key)来找值(value)特别适合查找
*		set /multiset map/multimap
*		根据键自动在内部排序,能控制插入内容,但是不能控制插入位置。
*		可以使用树,或者哈希来实现
*		
*	3.无序容器(unordered containers)c++11中推出的新名字。元素的位置不重要,重要的是元素是否在容器中
*		无序容易也是属于一种关联容器。
*		随着元素的的插入,每个元素在容器中的位置可能随着发生改变。内部可能使用哈希表来实现
*		常见的有:unordered_set unordered_multiset unordered_map  unordered_multimap
*	c++标准没有规定是用什么算法实现上面容器
*
*(2)容器的说明说明和应用事项例
*	2.1array本质上是一个内存空间连续的数组,大小固定,不能增加它的大小
*	对象是连续的,但是对象指向的字符串的内存空间没有关系
*
*(3)
*
*
*/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

002vector容器

#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>
#include <memory>

using namespace std;

class A
{
public:
	A(int a):m_i(a)
	{
		cout << "构造函数执行" << endl;
	}
	A(const A&a):m_i(a.m_i)
	{
		cout << "A的拷贝构造函数执行" << endl;
	}

	~A()
	{
		cout << "A的析构函数执行" << endl;
	}
public:
	int m_i;
};

int main(void)
{
	vector<A>myA;
	for (int i=0;i<5;i++)
	{
		cout << "----------begin-----------" << endl;
		myA.push_back(A(i));
		cout << "----------end-----------" << endl;

	}
	/*
	 * ----------begin-----------
		构造函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		----------end-----------
		----------begin-----------
		构造函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		----------end-----------
		----------begin-----------
		构造函数执行
		A的拷贝构造函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的析构函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		----------end-----------
		----------begin-----------
		构造函数执行
		A的拷贝构造函数执行
		A的拷贝构造函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的析构函数执行
		A的析构函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		----------end-----------
		----------begin-----------
		构造函数执行
		A的拷贝构造函数执行
		A的拷贝构造函数执行
		A的拷贝构造函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的析构函数执行
		A的析构函数执行
		A的析构函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		----------end-----------
		请按任意键继续. . .

	总结:先调用构造函数,创建一个临时地对象,然后使用拷贝构造函数,将对象拷贝进myA容器中,调用析构函数析构掉对象。
		
	 */

	//查看元素个数
	cout << myA.size() << endl;//5
	//查看容器空间个数
	cout << myA.capacity() << endl;//6

	//容器的地址和第一个元素的地址不相同
	printf("第一个元素的地址=%p\n", &myA[0]);//0073B730
	printf("容器的地址=%p\n", &myA);//0036F998

	//删除下标为2的元素,只调用一次析构函数
	int icount = 0;
	cout << "-------------" << endl;
	for (vector<A>::iterator iter=myA.begin();iter!=myA.end();iter++)
	{
		icount++;
		if (icount==2)
		{
			myA.erase(iter);
			break;
		}
	}

	cout << "****************************" << endl;
	for (vector<A>::iterator iter = myA.begin(); iter != myA.end(); iter++)
	{
		icount++;
		if (icount == 3)
		{
			myA.insert(iter, A(34));
			break;
		}
	}
	/*
	 *	 构造函数执行
		A的拷贝构造函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的拷贝构造函数执行
		A的析构函数执行
		A的析构函数执行

	 */

	//设置容器的最大元素个数
	vector<int>myint;
	myint.reserve(10);
	cout << myint.capacity() << endl;//10
	system("pause");
	return 0;
}

/*
*(1)vector容器实现类似于一个栈,向顶部增加元素和删除元素都很快,删除中间的元素很慢,查找的速度也不会太快
*
*	vector容器内存是挨着的,vector有一个“空间”的概念,每一个空间可以装一个元素。
*	当只有一个元素的时候,只有一个空间。当再插入一个元素的时候,找一段可以装两个元素的“空间”,
*	将原来的对象在新空间构造,析构掉老空间的对象。所以插入元素会调用多次构造函数和析构函数。
*	但是容器观测到你多次插入元素,容器会给你多分配内存,以便不用每次新分配内存。
*
*	也就是说,vector容器插入元素是不断寻找新的内存空间,析构和构造的过程。
*
*为什么要析构老元素,构造新元素?
*	主要的原因是这种容器的实现要求内存是连续的。
*	
*(2)我们使用vector,一般需要提前知道元素不超过多少个,把capacity设置为最大值
*
*(3)
*
*
*/

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39885372/article/details/107274427
今日推荐