目录
总起
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;
}
}