栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11 std::array的用法小结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11 std::array的用法小结

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

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

1、常规用法
#include 
#include 
#include 
#include //sort

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

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

	// 初始化数组对象
	std::array 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";

	// 初始化数组对象
	std::array 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 : %#ptintArray.data() address : %#pn", &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 arrayTemp = { 12, 34, 56 };
	printArray(arrayTemp);

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

	//输出 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
	std::vector 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 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 
#include 
#include 
#include //sort


void printArray(std::array& 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 ptrArray = { &parse1, &parse2, &parse3 };

int main()
{
	// 初始化数组
	std::array arr = { 1, 3, 2, 4, 6, 5 };
	std::array 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(std::cout, "-"));
	std::cout << 'n';

	//std::find
	std::array strArray = { "a", "b", "c", "d", "e", "f" };
	std::array::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::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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022604.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号