c++SLT之array
array其实就是定长数组,array是一个模板类,所以可以存储任何的数据类型
template <class _Ty, size_t _Size>
class array { // fixed size array of values
public:
....
};
//_Ty:代表的是存储的数据类型
//_Size:长度
因为array类的内部做了[]的重载,所以 直接可以把对象名当做数组名来用
/*
STL: 标准模板类库
1.容器
2.迭代器
3.算法
STL之array
*/
#include <array>
#include <iostream>
void testCreateArray()
{
std::array<int, 3> arr;
std::array<std::string, 3> str;
std::array<double, 3> dNum;
//列表数据做初始化
std::array<int, 3> iNum = {1,2,3};
}
void operation()
{
//基本操作
std::array<int, 3> arr = {1,2,3};
//for (int i = 0; i < 3; i++)
//{
// std::cin >> arr[i];
//}
for (auto v : arr)
{
std::cout << v << " ";
}
std::cout << std::endl;
//其他操作
//万金油
//empty: return curSize==0; 返回false表示不为空
std::cout <<"判断是否为空:" << arr.empty() << std::endl;
std::cout << "当前元素个数:" << arr.size() << std::endl;
//注意点: end是容器最后一个位置,不是最后一个元素的位置
std::cout << "第一个元素:" << arr.front() <<" "<<*arr.begin() << std::endl;
std::cout << "最后一个元素:" << arr.back() <<" "<<*(arr.end()-1) << std::endl;
//最大元素个数
std::cout << "max_size:" << arr.max_size() << std::endl;
for (int i = 0; i < arr.size(); i++)
{
//获取当前下标下面的值
std::cout << arr.at(i) << " ";
}
std::cout << std::endl;
//内置迭代器: begin() end()
std::array<int, 3>::iterator iter;
for (iter = arr.begin(); iter != arr.end(); iter++)
{
std::cout << *iter << " ";
}
std::cout << std::endl;
std::array<int, 3>::const_iterator c_iter;
for (c_iter = arr.cbegin(); c_iter != arr.cend(); c_iter++)
{
std::cout << *c_iter << " ";
}
std::cout << std::endl;
std::array<int, 3>::reverse_iterator r_iter;
//rbegin(): 最后一个元素的位置
//从后往前打印
for (r_iter = arr.rbegin(); r_iter != arr.rend(); r_iter++)
{
std::cout << *r_iter << " ";
}
std::cout << std::endl;
std::array<int, 3>::const_reverse_iterator cr_iter;
for (cr_iter = arr.crbegin(); cr_iter != arr.crend(); cr_iter++)
{
std::cout << *cr_iter << " ";
}
std::cout << std::endl;
//其他函数
/*
成员函数 说明
data 获取第一个元素的地址。
fill 将所有元素替换为指定值。
swap 交换两个容器的内容。
*/
std::array<std::string, 3> str;
str.fill("coolmoying");
for (auto v : str)
{
std::cout << v << std::endl;
}
std::string* pstr = str.data();
std::cout << *pstr << std::endl;
std::array<int, 3> one = {1,2,3};
//默认初始化为0
std::array<int, 3> two = {5,5};
one.swap(two);
for (auto v : one)
{
std::cout << v << " ";
}
std::cout << std::endl;
}
std::array<int,3> printArray(const std::array<int, 3>& value)
{
for (auto v : value)
{
std::cout << v << " ";
}
std::cout << std::endl;
return value;
}
class SqList
{
public:
SqList() :m_sqlist({0}),m_size(0)
{
}
void push_back(int data)
{
m_sqlist[m_size++] = data;
}
void print()
{
for (int i = 0; i < m_size; i++)
{
std::cout << m_sqlist[i] << " ";
}
}
protected:
std::array<int, 100> m_sqlist;
int m_size;
};
void arrayAsData()
{
//array模板是一个类模板,所以他就是一个数据类型.
//所以数据能做的,它都可以做
// 1.当做函数参数
// 2.当做函数返回值
// 3.当做类的数据成员
//新标准中创建初始化 =可以省略
std::array<int, 3> num{ 1,2,3 };
printArray(num);
printArray(printArray(printArray(num)));
SqList sqlist;
sqlist.push_back(1);
sqlist.push_back(2);
sqlist.print();
}
//容器操作用户数据,唯一的难点是在运算符重载
class MM
{
public:
MM(std::string name = "", int age = 0) :m_name(name), m_age(age) {}
void printMM()
{
std::cout << m_name << " " << m_age ;
}
friend std::istream& operator>>(std::istream& in, MM& object)
{
std::cout << "input MM info:";
in >> object.m_name >> object.m_age;
return in;
}
friend std::ostream& operator<<(std::ostream& out, const MM& object)
{
out << object.m_name << " " << object.m_age;
return out;
}
protected:
std::string m_name;
int m_age;
};
void OperationUserData()
{
std::array<MM, 3> mm;
mm[0] = MM("小芳", 18);
std::cin >> mm[1];
MM girl = { "小美", 18 };
mm[2] = girl;
//v -->mm
for (auto v : mm)
{
//v.printMM();
//管理自定义类型必须要去做运算符重载
std::cout << v << std::endl;
}
std::cout << mm.max_size() << std::endl;
//有些函数是需要重载其他运算符的
//所以同学们需要学会看错误(sort的算法排序)
}
//array嵌套
void arrayNest()
{
std::array<std::array<int, 3>, 4> arr = {1,2,3,4,5,6,7,8,9,10,11,12};
//如果打开读起来比较难懂的,起别名替换
using Type = std::array<int, 3>;
std::array<Type, 4> arr2;
for (int i = 0; i < arr.size(); i++)
{
for (int j = 0; j < arr[i].size();j++)
{
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}
std::cout << "区间遍历:" << std::endl;
for (auto v : arr) //v: std::array<int, 3>
{
for (auto vv : v)
{
std::cout << vv << " ";
}
std::cout << std::endl;
}
}
int main()
{
//operation();
//arrayAsData();
//OperationUserData();
arrayNest();
return 0;
}