c++11 stl-array

#include <iostream>
#include <array>
#include <cstring>

//c++ 11

template<typename C>
void checkSize(C &c) {
	if(c.size() > 3) {
		c[3] = 10; //单线程OK,多线程可能出错
	}
	c.at(3) = 10;
}


void arrayPart() {
	//array 实际上是对c/c++语言中的原生数组进行了封装
	//namespace std {
	//template<typename T, size_t N>
	//	class array;
	//}
	
	//特点: 内存分配在栈(stack), 绝不会重写分配.随机访问元素
	std::array<int, 100> a; //不进行初始化, 只管分配内存
	std::array<int, 100> b = {}; //初始化为 0 
	//以上两者的区别.

	std::array<int, 5> obj = {1, 2, 3, 4, 5};
	std::array<int, 5> obj2 = {1}; //第一个为1, 后面不0

	//接口
	a.empty(); //never be true if size > 0
	a.size();
	a.max_size();

	//operator == < != > <= >=
	auto aa = a;
	aa.swap(a); //array的swap是交换每一个元素都需要做交换,因为它是在stack中储存的.不是通过堆来管理
	//访问元素
	a[1]; //不进行检查,越界出错
	a.at(1); //进行检查,越界抛出异常
	a.front(); //返回头部元素的引用
	a.back();  //返回最后元素的引用
	checkSize(a);

	//迭代器相关的:
	a.begin(); //可以对begin减引操作, 但不能堆end进行此操作
	a.end();
	a.cbegin(); //const 引用
	a.cend();
	
	a.rbegin(); //从尾部遍历到头部,与以上相反
	a.rend();

	a.crbegin(); //const 方式从尾部遍历到头部
	a.crend();


	//和C的接口互用
	std::array<char, 100> carr;
	strcpy(&carr[0], "hello world\n");
	printf("%s", &carr[0]); //更好的使用 carr.data();
	printf("%s", carr.data());
	//错误用法
	printf("%s", carr.begin());


	//特殊的地方
	auto info = std::get<1>(carr); //与 carr[1] 一样
	printf("%c\n", info); //
	carr.fill(0); //对所有元素赋予0

	//异常 exception
	//c.at(pos)
	//copy move swap, 进行操作时,可能触发异常

}
int main(void) {

	arrayPart();
	return 0;
}

posted @ 2020-02-24 19:43  i0gan  阅读(112)  评论(0编辑  收藏  举报