c++SLT之array

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Theliars

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值