STL容器(上)c++

目录

一、array容器 包含头文件array

(1)数组的部分内置函数和用法

(2)用数组存储自定义类型的数据

(3)补充说明 

二、vector容器    包含头文件vector     

(1)三种使用方式

(2)使用自定义类型的数据

(3)其他操作

三、vector与array的嵌套

(1)array与array的嵌套

(2)vector与vector的嵌套

(3)array与vector组合

(4)vector与array组合


总起

array必须传入长度,vector不用传入长度自己可以调节长度

对于迭代器注意返回的数据类型即可

一、array容器 包含头文件array

和数组使用方式相同,需要确定长度

定义:array<变量类型,长度> 变量名 ;例如array<int,3> at;

初始化方式

//两种初始化方式
//1
	array<int, 3> at = {1,2,3};
//2
	for (int i = 0;i < at.size();i++)
	{
		at[i]=i;
	}

//返回数组
 

//返回数组
array<int, 3> asd(array<int, 3>& temp)
{
	return temp;
}

(1)数组的部分内置函数和用法

void testExOperator()
{
	//数组也是一种容器
	//使用和数组一样
	//一些函数
	array<int, 3> test = { 1,2,3 };
	cout << test.empty() << endl;//判读那是否为空
	cout << test.size() << endl;//大小
	test.fill(5);//数组内部数据填充为5,所有元素为5
    
    //遍历
	//写int v:test也可以
//新的容器语法,容器必须要有迭代器
	for (auto v : test)
	{
		cout << v << endl;
	}
	array<int, 3> test1 = { 3,4,5 };
	test.swap(test1);//交换数组 长度必须要一样长

	int cData[3] = { 1,2,3 };
	//映射:一种对应关系,数组下标对应元素
		for (auto v : cData)
		{
			cout << v  << endl;
		}
}

(2)用数组存储自定义类型的数据

首先创建一个类

class MM
{
public:
	MM() {}
	MM(string name, int age) :name(name), age(age) {}
	void print()
	{
		cout << name << "\t" << age << endl;
	}
protected:
	string name;
	int age;
};

其次

begin()表示第一个元素前的位置

end()表示最后一个元素后的位置

比如  1、2、3、4、5 

如果取区间 2、3、4

那么begin()表示1与2之间的位置 

end()表示4与5之间的位置

void testUserData()
{
	//创建MM对象时需要调用MM的构造函数,new的过程是调用无参的构造函数
	array<MM, 3> mmData;//等效创建了MM array[3]
	//赋值
    for (int i = 0;i < mmData.size(); i++)
	{
		string name = "name";
		//内部对[]进行了重载 下面有补充说明
		mmData[i] = MM(name + to_string(i), 16 + i);
	}

	//遍历方式1
    for (auto v : mmData)
	{
		v.print();
	}
	//迭代器访问  实质是类中类
	//对象模仿指针行为,*迭代器   就是取值运算
	array<MM, 3>::iterator iter;//类中类
	
//begin()第一个 end()最后一个位置(不是最后一个元素的位置)
//比如1,2,3,4,5   end()表示5后面第一个位置

	(*mmData.begin()).print();
	//(*mmData.end()).print();//越界访问
	(*(mmData.end()-1)).print();

//迭代器遍历
	for (iter = mmData.begin();iter != mmData.end();iter++)
	{
		//(*iter).print()都可以
		iter->print();
	}
}

(3)补充说明 

mmData[i] = MM(name + to_string(i), 16 + i);

模拟内部对[]进行重载、

template <class _Ty,size_t size>
class MyArray
{
public:
	MyArray()
	{
		memory = new _Ty[size];
	}
//重载
	_Ty*& operator[](int index)
	{
		return memory[index];
	}
	~MyArray()
	{
		delete[] memory;
	}
protected:
	_Ty* memory;
};

二、vector容器    包含头文件vector     

和数组差不多但是不需要确定的长度,可以自己变化长短

作为辅助函数打印数据

vector中后续代码会使用这个打印函数

template <class _Ty>
void printVector(vector<_Ty>& temp)
{
	for (auto v : temp)
	{
		cout << v << "\t";
	}
}

(1)三种使用方式

void testCreateVector()
{
	//1不带长度
	vector<int> vecData;
	//只能用成员函数做插入
	for (int i = 0;i < 3;i++)
	{
		vecData.push_back(i);//尾插法
	}
	printVector(vecData);

	//2带长度  表示长度为3
	vector<string> strData(3);
	//确定长度,可以直接使用数组法插入
	for (int i = 0;i < 3;i++)
	{
		string name = "name";
	//只有按照自确定长度范围以内的可以直接采用数组法插入
		strData[i] = name + to_string(i);
	}
	//超过的必须用成员函数插入
	printVector(strData);

	//3初始化
	vector<double> dData = { 1,3,2,21 };//自动算出长度
	printVector(dData);

	//在原内存的后面扩增,原容器内垃圾值默认为0
	vector<int> inData(3);
	inData.push_back(111);
	printVector(inData);//打印结果0 0 0 111

	//迭代器访问
	vector<string>::iterator iter;
	for (iter = strData.begin();iter != strData.end();iter++)
	{
		cout << *iter << "\t";
	}
}

(2)使用自定义类型的数据

class MM
{
public:
	MM(string name, int age) :name(name), age(age) {}
//重载
	friend ostream& operator<<(ostream& out, const MM& temp)
	{
		out << temp.name << "\t" << temp.age << endl;
		return out;
	}
protected:
	string name;
	int age;
};
void testUserData()
{//不需要无参的构造函数
	vector<MM> mmData;
	for (int i = 0;i < 3;i++)
	{
		string name = "name";
		mmData.push_back(MM(name + to_string(i),18));
	}
	printVector(mmData);
}

(3)其他操作

void testExOperator()
{
	vector<int> iData = { 1,2,3,4 };
	cout << iData.size() << endl;//当前容器中元素个数
	cout << iData.empty() << endl;//是否为空
	cout << iData.front() << endl;//访问第一个元素
	cout << iData.back() << endl;//访问最后一个元素
	cout << iData.at(2) << endl;//下标访问
	cout << iData[2] << endl;//和at一样
	//通过指定位置修改 
	iData.emplace(iData.begin()+2,100);
	printVector(iData);
	iData.emplace_back(999);//和push_back()一样
	//删除元素 数组无法做删除 只有伪删除
	//iData.erase(iData.begin() + 2);
	//批量复制
	int array1[] = {1,2,3};
	vector<int> vecData;
	//指定范围 array1到array1+3 不包括array+3
	vecData.assign(array1, array1 + 3);
	printVector(vecData);
}

三、vector与array的嵌套

#include<iostream>
#include<array>
#include<vector>
#include<string>
#include<ctime>
#include<cstdlib>

(1)array与array的嵌套

void testArrayVsArray()
{//arrData存储4个array<int, 3>的数据
	array<array<int, 3>, 4> arrData;
	for (int i = 0;i < 4;i++)
	{
		for (int j = 0;j < 3;j++)
		{
			arrData[i][j] = i * j;
			cout << arrData[i][j] << "\t";
		}
		cout << endl;
	}
}

(2)vector与vector的嵌套

void testVectorVSVector()
{
	srand((unsigned int)time(nullptr));
	vector<vector<int>> vecData;
	//一般vector采用push_back插入
	for (int i = 0;i < 4;i++)
	{
		vector<int> temp;
		for (int j = 0;j < rand()%3+2;j++)
		{
			temp.push_back(i * j);
		}
		vecData.push_back(temp);
	}
	//可以实现不等列数的二维数组
//vecData.size()的大小是4
//vecData[i]大小是产生的随机苏
	for (int i = 0;i < vecData.size();i++)
	{
		for (int j = 0;j < vecData[i].size();j++)
		{
			cout<<vecData[i][j]<<"\t";
		}
		cout << endl;
	}

}

(3)array与vector组合

void testArrayVsVector()
{//存储3个vector<int>数据
	array<vector<int>, 3> vecArr;
	vector<int> vec1[3] = { {1,2,3},{1},{1,2} };
	for (int i = 0;i < vecArr.size();i++)
	{
		vecArr[i] = vec1[i];
	}
	for (int i = 0;i < vecArr.size();i++)
	{
		for (int j = 0;j < vecArr[i].size();j++)
		{
			cout << vecArr[i][j] << "\t";
		}
		cout << endl;
	}
}

(4)vector与array组合

void testVectorVsArray()
{
	vector<array<int, 3>> arrVec;
	array<int,3> arr[3]= { {1,2,3},{1},{1,2} };
	for (int i = 0;i < 3;i++)
	{
		arrVec.push_back(arr[i]);
	}
	for (int i = 0;i < arrVec.size();i++)
	{
		for (int j = 0;j < arrVec[i].size();j++)
		{
			cout <<arrVec[i][j] << "\t";
		}
		cout << endl;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值