一、
1、和 C++ 普通数组存储数据的方式一样,C++ 标准库保证使用 array 容器存储的所有元素一定会位于连续且相邻的内存中。因此在实际编程过程中,我们完全有理由去尝试,在原本使用普通数组的位置,改由 array 容器去实现。举个例子,我们完全可以使用 array 容器去存储 char* 或 const char* 类型的字符串:
#include <iostream>
#include <array>
#pragma warning(disable:4996)
using namespace std;
int main() {
array<char, 50>a{ 1,2,3 };
strcpy(&a[0], "http://c.biancheng.net/stl");
printf("%s ", &a[0]); //http://c.biancheng.net/stl
return 0;
}
注意,array 容器的大小必须保证能够容纳复制进来的数据,而且如果是存储字符串的话,还要保证在存储整个字符串的同时,在其最后放置一个\0作为字符串的结束符。此程序中,strcpy() 在拷贝字符串的同时,会自动在最后添加\0。
2、上诉代码中的 &a[0] 还可以用 array 模板类提供的 data() 成员函数来替换:
#include <iostream>
#include <array>
#pragma warning(disable:4996)
using namespace std;
int main() {
array<char, 50>a{ 1,2,3 };
strcpy(a.data(), "http://c.biancheng.net/stl");
printf("%s ", a.data());
return 0;
}
3、使用 array 容器代替普通数组,最直接的好处就是 array 模板类中已经为我们写好了很多实用的方法,可以大大提高我们编码效率。
#include <iostream>
#include <array>
using namespace std;
int main() {
array<char, 50>addr1{ "http://c.biancheng.net" };
array<char, 50>addr2{ "http://c.biancheng.net/stl" };
addr1.swap(addr2);
printf("addr1 is:%s\n", addr1.data());
printf("addr2 is:%s\n", addr2.data());
return 0;
}
当两个 array 容器满足大小相同并且保存元素的类型相同时,两个 array 容器可以直接直接做赋值操作 addr1 = addr2;
不仅如此,在满足以上 2 个条件的基础上,如果其保存的元素也支持比较运算符,就可以用任何比较运算符直接比较两个 array 容器。示例如下:
1. #include <iostream>
1. #include <array>
1. using namespace std;
1. int main()
1. {
1. array<char, 50>addr1{ "http://c.biancheng.net" };
1. array<char, 50>addr2{ "http://c.biancheng.net/stl" };
1. if (addr1 == addr2) {
1. std::cout << "addr1 == addr2" << std::endl;
1. }
1. if (addr1 < addr2) {
1. std::cout << "addr1 < addr2" << std::endl;
1. }
1. if (addr1 > addr2) {
1. std::cout << "addr1 > addr2" << std::endl;
1. }
1. return 0;
1. }
两个容器比较大小的原理,和两个字符串比较大小是一样的,即从头开始,逐个取两容器中的元素进行大小比较(根据 ASCII 码表),直到遇到两个不相同的元素,那个元素的值大,则该容器就大
4、总之,读者可以这样认为,array 容器就是普通数组的“升级版”,使用普通数组能实现的,使用 array 容器都可以实现,而且无论是代码功能的实现效率,还是程序执行效率,都比普通数组更高。