std::array 是在 C++11 中引入的,与内置数组相比,std::array是一种更安全、更容易使用的数组类型。与内置数组类似,std::array对象的大小是固定的。因此,std::array不支持添加和删除元素以及改变容器大小的操作。

std::array 除了有传统数组支持随机访问、效率高、存储大小固定等特点外,还支持迭代器访问、获取容量、获得原始指针等高级功能。而且它还不会退化成指针T *给开发人员造成困惑。

1、常规用法

#include <iostream>
#include <array>
#include <vector>
#include <algorithm>//sort

void printArray(std::array<int, 10>& arr)
{
	for (auto& elem : arr)
	{
		std::cout << elem << ", ";
	}
	std::cout << std::endl;
}

int main()
{
	// 未初始化的数组对象包含有垃圾值的元素
	std::array<int, 10> uninitArray;
	printArray(uninitArray);

	// 初始化数组对象<method-1>
	std::array<int, 5> arrays;
	std::get<0>(arrays) = 10;
	std::get<1>(arrays) = 20;
	std::get<2>(arrays) = 30;
	std::cout << "[0]=" << std::get<0>(arrays) << "\n";
	std::cout << "[1]=" << std::get<1>(arrays) << "\n";
	std::cout << "[2]=" << std::get<2>(arrays) << "\n";

	// 初始化数组对象<method-2>
	std::array<int, 10> intArray = { 1, 0, 3, 2, 5, 4, 7, 6, 8, 9 };
	std::for_each(intArray.begin(), intArray.end(), [](int& i) {i++; });
	printArray(intArray);
	//
	std::cout << "empty()=" << intArray.empty() << std::endl;
	std::cout << "size()=" << intArray.size() << std::endl;
	
	//输出 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
	std::sort(intArray.begin(), intArray.end());
	printArray(intArray);

	// 不进行越界检查
	int x = intArray[2];
	// 进行越界检查
	int y = intArray.at(3);
	// std::get<>()
	int z = std::get<4>(intArray);
	std::cout << "x=" << x << ", y=" << y << ", z=" << z << "\n";

	// 访问第一个元素
	std::cout << "intArray.front() : " << intArray.front() << std::endl;
	// 访问最后一个元素
	std::cout << "intArray.back() : " << intArray.back() << std::endl;
	// 返回指向内存中数组第一个元素的指针
	printf("intArray[0] address : %#p\tintArray.data() address : %#p\n", &intArray[0], intArray.data());

	try
	{
		int w = intArray.at(12);
	}
	catch (const std::out_of_range& exp)
	{
		std::cerr << exp.what() << std::endl;
	}

	// 前3个值将被初始化,其他值将为0
	std::array<int, 10> arrayTemp = { 12, 34, 56 };
	printArray(arrayTemp);

	// 将数组中的所有元素填充为相同的值
	std::array<int, 10> arrayWithSameVal;
	arrayWithSameVal.fill(66);
	printArray(arrayWithSameVal);

	//输出 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
	std::vector<int> vct;
#if 0
	vct.resize(intArray.size());
	std::reverse_copy(intArray.begin(), intArray.end(), vct.begin());
#endif
	std::reverse_copy(intArray.begin(), intArray.end(), std::back_inserter(vct));
	for (auto v : vct) {
		std::cout << v << ", ";
	}
	std::cout << '\n';

	return 0;
}

2、输出结果

-858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460, -858993460,
[0]=10
[1]=20
[2]=30
2, 1, 4, 3, 6, 5, 8, 7, 9, 10,
empty()=0
size()=10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
x=3, y=4, z=5
intArray.front() : 1
intArray.back() : 10
intArray[0] address : 000000260FD5F048  intArray.data() address : 000000260FD5F048
invalid array<T, N> subscript
12, 34, 56, 0, 0, 0, 0, 0, 0, 0,
66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
10, 9, 8, 7, 6, 5, 4, 3, 2, 1,

3、其他用法

#include <iostream>
#include <array>
#include <vector>
#include <algorithm>//sort


void printArray(std::array<int, 6>& arr)
{
	for (auto& elem : arr)
	{
		std::cout << elem << ", ";
	}
	std::cout << std::endl;
}


void parse1(std::string& root){
	std::cout << "parse1=" << root << std::endl;
}
void parse2(std::string& root) {
	std::cout << "parse2=" << root << std::endl;
}
void parse3(std::string& root) {
	std::cout << "parse3=" << root << std::endl;
}

using parseCallback = void (*)(std::string& object);
std::array<parseCallback, 3> ptrArray = { &parse1, &parse2, &parse3 };

int main()
{
	// 初始化数组
	std::array<int, 6> arr = { 1, 3, 2, 4, 6, 5 };
	std::array<int, 6> arr2 = arr;
	printArray(arr2);

	//输出 1, 2, 3, 4, 5, 6,
	std::sort(arr.begin(), arr.end());
	printArray(arr);

	//输出 6-5-4-3-2-1-
	std::reverse_copy(arr.begin(), arr.end(), std::ostream_iterator<int>(std::cout, "-"));
	std::cout << '\n';

	//std::find
	std::array<std::string, 6> strArray = { "a", "b", "c", "d", "e", "f" };
	std::array<std::string, 6>::iterator itr = std::find(strArray.begin(), strArray.end(), "c");
	if (itr != strArray.end())
	{
		std::cout << "the index of \"" << (*itr) << "\" is " << std::distance(strArray.begin(), itr) << std::endl;
	}

	//
	std::array<parseCallback, 3>::iterator idx = std::find(ptrArray.begin(), ptrArray.end(), parse2);
	if (idx != ptrArray.end())
	{
		std::cout << "the index of \"" << (*idx) << "\" is " << std::distance(ptrArray.begin(), idx) << std::endl;
		if (*idx)
		{
			std::string str = "hello, this is kandy";
			(*idx)(str);
		}
	}
	return 0;
}

4、输出结果

1, 3, 2, 4, 6, 5,
1, 2, 3, 4, 5, 6,
6-5-4-3-2-1-
the index of "c" is 2
the index of "00007FF643B712D5" is 1
parse2=hello, this is kandy
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐