定义

  • std::array 是一个定长容器,其大小在编译时就必须确定,之后不能改变
  • 通常分配在栈上,使用连续的栈内存布局,这使得它在性能上很接近 C 风格的数组
  • 与 C 风格数组不同,std::array 不会自动退化为指针,提供了更好的类型安全性

初始化

默认初始化

不提供初始值,所有元素将执行默认初始化。对于内置类型如 int,这意味着元素值未定义(包含"垃圾值")

std::string getStringFromU8string(const std::u8string& u8str) {
	return std::string(reinterpret_cast<const char*>(u8str.data()), u8str.size());
}

std::u8string getU8stingFromString(const std::string& str) {
	return std::u8string(reinterpret_cast<const char8_t*>(str.data()), str.size());
}

int main()
{
	system("chcp 65001");
	std::array<int, 4> arr1;
	for (auto it : arr1)
	{
		cout << "arr1-> " << it << endl;
	}

	std::array<std::u8string, 4> arr2;
	for (auto it : arr2)
	{
		cout << "arr2-> " << getStringFromU8string(it) << endl;
	}
}

列表初始化

数组长度超过实际元素个数,剩余元素会初始化默认值

int main()
{
	system("chcp 65001");
	std::array<std::u8string, 2> arr1 = { u8"张三", u8"李四" };
	for (auto it : arr1)
	{
		cout << "arr1-> " << getStringFromU8string(it) << endl;
	}

	std::array<std::u8string, 4> arr2{ u8"北京", u8"上海", u8"广州", u8"深圳" };
	for (auto it : arr2)
	{
		cout << "arr2-> " << getStringFromU8string(it) << endl;
	}
	
	// 自动推导
	std::array arr3 = { u8"张三", u8"李四" };
	auto arr4 = { u8"北京", u8"上海", u8"广州", u8"深圳" };
	for (auto it : arr3)
	{
		cout << "arr3-> " << getStringFromU8string(it) << endl;
	}
	for (auto it : arr4)
	{
		cout << "arr4-> " << getStringFromU8string(it) << endl;
	}
}

常用函数

方法 功能说明
at(index) 安全访问元素,越界时抛出 std::out_of_range 异常
operator[] 直接访问元素(不检查边界)
front() 返回第一个元素
back() 返回最后一个元素
data() 返回指向内部数组首元素的指针(可用于 C API)
empty() 如果大小为 0 返回 true(对于非零大小的 array 总是 false)
size() 返回元素个数(编译时常量)
max_size() 返回最大可能大小(通常等于 size())
fill(value) 将所有元素设置为指定值
swap(other) 与另一个 array 交换内容
int main()
{
	system("chcp 65001");
	std::array<std::u8string, 4> arr1{ u8"北京", u8"上海", u8"广州", u8"深圳" };

	cout << "arr1.size()= " << arr1.size() << endl;
	cout << "arr1.max_size()= " << arr1.max_size() << endl;
	cout << "arr1.empty()= " << boolalpha << arr1.empty() << endl;

	cout << "arr1[1]= " << getStringFromU8string(arr1[1]) << endl;
	cout << "arr1.at(0)= " << getStringFromU8string(arr1.at(0)) << endl;
	// 第一个元素
	cout << "arr1.front()= " << getStringFromU8string(arr1.front()) << endl;
	// 最后一个元素
	cout << "arr1.back()= " << getStringFromU8string(arr1.back()) << endl;
	// 数组首元素的指针
	std::u8string* ptr = arr1.data();
	for (int i = 0; i < arr1.size(); i++)
	{
		cout << getStringFromU8string(ptr[i]) << endl;
	}

	// 将所有元素设置为指定值
	arr1.fill(u8"张三");
	for (auto it : arr1)
	{
		cout << getStringFromU8string(it) << endl;
	}
	// 与另一个 array 交换内容
	std::array<std::u8string, 4> arr2{ u8"北京", u8"上海", u8"广州", u8"深圳" };
	arr1.swap(arr2);
	for (auto it : arr1)
	{
		cout << "arr1-> " << getStringFromU8string(it) << endl;
	}

	for (auto it : arr2)
	{
		cout << "arr2-> " << getStringFromU8string(it) << endl;
	}
}

迭代

常用forbegin-endrbegin-rend

int main()
{
	system("chcp 65001");
	std::array<std::u8string, 4> arr1{ u8"北京", u8"上海", u8"广州", u8"深圳" };

	// for循环
	for (auto it : arr1) {
		cout << getStringFromU8string(it) << endl;
	}

	// begin-end正向遍历
	for (auto it = arr1.begin(); it != arr1.end(); it++)
	{
		cout << "begin-end " << getStringFromU8string(*it) << endl;
	}

	// cbegin-cend正向遍历
	for (auto it = arr1.cbegin(); it != arr1.cend(); it++)
	{
		cout << "cbegin-cend " << getStringFromU8string(*it) << endl;
	}

	// rbegin-rend反向遍历
	for (auto it = arr1.rbegin(); it != arr1.rend(); it++)
	{
		cout << "rbegin-rend " << getStringFromU8string(*it) << endl;
	}
}

其他

特性 std::array 原生数组 std::vector
大小是否固定
内存位置 栈(通常) 栈/静态区
支持拷贝赋值
支持 STL 算法 ❌(需指针)
越界检查 at() 支持 不支持 at() 支持
性能 极高 极高 略低(动态分配)
传递到函数 可直接传值 退化为指针 可传引用/值
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐