F_JustWei's Studio.

C++容器 array

字数统计: 1.7k阅读时长: 8 min
2021/05/15 Share

C++容器 array

C++ 11 中将数组抽象成了一个模板类array

array 位于名称空间 std 中,与数组一样, array 的长度是固定的,也使用栈(静态内存分配),而不是自由存储区,因此其效率与数组相同,但更方便,更安全。

零大小的数组是有效的,不应取消引用(成员 front() , back() 和 data() )。

与标准库中的其他容器不同,交换两个数组容器是一种线性操作,涉及单独交换范围内的所有元素,这通常效率较低。另一方面,这允许迭代器访问两个容器中的元素,以保持其原始容器关联。

数组容器的另一个独特功能是可以将它们视为元组对象。

模板参数(Template parameters)

1
template <class _Ty, size_t _Size>// _Ty是所含元素的类型,_Size是数组的大小,以元素数表示。

成员类型(Member types)

1
2
3
4
5
6
7
8
9
10
11
12
using value_type      = _Ty;
using size_type = size_t;
using difference_type = ptrdiff_t;
using pointer = _Ty*;
using const_pointer = const _Ty*;
using reference = _Ty&;
using const_reference = const _Ty&;

using iterator = _Array_iterator<_Ty, _Size>;
using const_iterator = _Array_const_iterator<_Ty, _Size>;
using reverse_iterator = _STD reverse_iterator<iterator>;
using const_reverse_iterator = _STD reverse_iterator<const_iterator>;

成员函数(Member functions)

函数名 函数功能
begin 返回第一个元素的 iterator
end 返回最后一个元素的下一个元素的 iterator
rbegin 返回反向迭代器反向开始的 iterator
rend 返回反向迭代器返回到反向端点的 iterator
cbegin 返回第一个元素的 const_iterator
cend 返回最后一个元素的下一个元素的 const_iterator
crbegin 返回反向迭代器反向开始的 const_iterator
crend 返回反向迭代器返回到反向端点的 const_iterator
size 返回大小
max_size 返回最大大小
empty 测试数组是否为空
operator[] 访问元素
at 访问元素
front 访问第一个元素
back 访问最后一个元素
data 获取指向数据的指针
fill 用值填充数组
swap 交换内容
get 获取元素(元组接口)
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <array>
#include <iostream>
using namespace std;
const int SIZE = 100;
int main() {
//初始化,第一个参数填数据类型,第二个参数填数据个数
array<int, 0> a;
array<int, SIZE> b;
//初始化并赋值
array<int, SIZE> c{ 1,2,3 };
//赋值
for (int i = 0; i < SIZE; i++) {
b[i] = rand();
}
//输出前10个
for (int i = 0; i < 10; i++) {
cout << "array的第 " << i << " 个元素:" << b[i] << " " << endl;
}
cout << endl;
//8种迭代器
auto begin = b.begin(); //返回第一个元素的iterator
auto end = b.end(); //返回最后一个元素的下一个元素的iterator
auto rbegin = b.rbegin(); //返回最后一个元素的iterator
auto rend = b.rend(); //返回第一个元素的前一个元素的iterator
auto cbegin = b.cbegin(); //返回const_iterator,该const_iterator指向第一个元素
auto cend = b.cend(); //返回const_iterator,该iconst_iterator指向最后一个元素的下一个元素
auto crbegin = b.crbegin(); //返回const_iterator,该const_iterator指向最后一个元素
auto crend = b.crend(); //返回const_iterator,该const_iterator指向第一个元素的前一个元素

//函数
cout << "array.size() = " << b.size() << endl;
cout << "array.max_size() = " << b.max_size() << endl;
cout << "array.empty() = " << b.empty() << endl;
cout << "array.at(0) = " << b.at(0) << endl;
cout << "array.front() = " << b.front() << endl;
cout << "array.back() = " << b.back() << endl;
cout << "array.data() = " << b.data() << endl;
//可以像tuple一样使用get
cout << "array[0] =" << get<0>(b) << endl;
cout << "array[1] =" << get<1>(b) << endl;
b.swap(c);
cout << endl << "array.swap()" << endl;
for (int i = 0; i < 10; i++) {
cout << "array的第 " << i << " 个元素:" << b[i] << " " << endl;
}
b.fill(6);
cout << endl << "array.fill()" << endl;
for (int i = 0; i < 10; i++) {
cout << "array的第 " << i << " 个元素:" << b[i] << " " << endl;
}

return 0;
}
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
array的第 0 个元素:41
array的第 1 个元素:18467
array的第 2 个元素:6334
array的第 3 个元素:26500
array的第 4 个元素:19169
array的第 5 个元素:15724
array的第 6 个元素:11478
array的第 7 个元素:29358
array的第 8 个元素:26962
array的第 9 个元素:24464

array.size() = 100
array.max_size() = 100
array.empty() = 0
array.at(0) = 41
array.front() = 41
array.back() = 24464
array.data() = 003EF6AC
array[0] =41
array[1] =18467

array.swap(c)
array的第 0 个元素:1
array的第 1 个元素:2
array的第 2 个元素:3
array的第 3 个元素:0
array的第 4 个元素:0
array的第 5 个元素:0
array的第 6 个元素:0
array的第 7 个元素:0
array的第 8 个元素:0
array的第 9 个元素:0

array.fill(6)
array的第 0 个元素:6
array的第 1 个元素:6
array的第 2 个元素:6
array的第 3 个元素:6
array的第 4 个元素:6
array的第 5 个元素:6
array的第 6 个元素:6
array的第 7 个元素:6
array的第 8 个元素:6
array的第 9 个元素:6

操作符重载(Operators overloading)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
template <class _Ty, size_t _Size>
_NODISCARD bool operator==(const array<_Ty, _Size>& _Left, const array<_Ty, _Size>& _Right) {
return _STD equal(_Left.begin(), _Left.end(), _Right.begin());
}

template <class _Ty, size_t _Size>
_NODISCARD bool operator!=(const array<_Ty, _Size>& _Left, const array<_Ty, _Size>& _Right) {
return !(_Left == _Right);
}

template <class _Ty, size_t _Size>
_NODISCARD bool operator<(const array<_Ty, _Size>& _Left, const array<_Ty, _Size>& _Right) {
return _STD lexicographical_compare(_Left.begin(), _Left.end(), _Right.begin(), _Right.end());
}

template <class _Ty, size_t _Size>
_NODISCARD bool operator>(const array<_Ty, _Size>& _Left, const array<_Ty, _Size>& _Right) {
return _Right < _Left;
}

template <class _Ty, size_t _Size>
_NODISCARD bool operator<=(const array<_Ty, _Size>& _Left, const array<_Ty, _Size>& _Right) {
return !(_Right < _Left);
}

template <class _Ty, size_t _Size>
_NODISCARD bool operator>=(const array<_Ty, _Size>& _Left, const array<_Ty, _Size>& _Right) {
return !(_Left < _Right);
}

从上述原码可以看出:

operation equivalent operation
left != right !(left == right)
left > right right< left
left <= right !(right< left)
left >= right !(left < right)
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <array>
#include <iostream>
int main()
{
std::array<int, 5> a = { 10, 20, 30, 40, 50 };
std::array<int, 5> b = { 10, 20, 30, 40, 50 };
std::array<int, 5> c = { 50, 40, 30, 20, 10 };

if (a == b) std::cout << "a and b are equal\n";
if (b != c) std::cout << "b and c are not equal\n";
if (b < c) std::cout << "b is less than c\n";
if (c > b) std::cout << "c is greater than b\n";
if (a <= b) std::cout << "a is less than or equal to b\n";
if (a >= b) std::cout << "a is greater than or equal to b\n";

return 0;
}
输出:
1
2
3
4
5
6
a and b are equal
b and c are not equal
b is less than c
c is greater than b
a is less than or equal to b
a is greater than or equal to b
CATALOG
  1. 1. C++容器 array
    1. 1.0.1. 模板参数(Template parameters)
    2. 1.0.2. 成员类型(Member types)
    3. 1.0.3. 成员函数(Member functions)
      1. 1.0.3.0.1. 示例:
      2. 1.0.3.0.2. 输出:
  2. 1.0.4. 操作符重载(Operators overloading)
    1. 1.0.4.0.1. 示例:
    2. 1.0.4.0.2. 输出: