C++17 中 std::size、std::empty 和 std::data 非成员函数介绍
文章目录
- 1. std::size
- 1.1 功能概述
- 1.2 具体用法
- 1.3 示例代码
- 1.4 代码解释
- 2. std::empty
- 2.1 功能概述
- 2.2 示例代码
- 2.3 代码解释
- 3. std::data
- 3.1 功能概述
- 3.2 示例代码
- 3.3 代码解释
- 4. 使用场景
- 5. 注意事项
在 C++17 里,std::size
、std::empty
和 std::data
作为非成员函数被引入,其目的是为容器和数组提供统一的访问接口。这样做能够简化代码编写过程,避免直接调用容器的成员函数,并且可以支持更多类型的容器和数组。下面对这三个函数进行详细介绍。
1. std::size
1.1 功能概述
std::size
是一个非成员函数,主要用于获取容器或数组的大小。它能以统一的方式处理不同类型的容器和数组,根据操作对象的不同采用不同的实现策略。
1.2 具体用法
- 对于容器类型:像
std::vector
、std::map
这类标准容器,std::size
会调用容器自身的size()
成员函数来获取容器中元素的数量。 - 对于数组:
std::size
会直接返回数组的大小,也就是数组中元素的数量。
1.3 示例代码
#include <vector>
#include <iostream>
int main() {
// 定义一个包含 3 个元素的 vector 容器
std::vector<int> vec = {1, 2, 3};
// 定义一个包含 3 个元素的数组
int arr[] = {4, 5, 6};
// 输出 vector 容器的大小
std::cout << "Vector size: " << std::size(vec) << std::endl;
// 输出数组的大小
std::cout << "Array size: " << std::size(arr) << std::endl;
return 0;
}
1.4 代码解释
在上述代码中,std::size(vec)
调用了 std::vector
的 size()
成员函数,输出结果为 3;std::size(arr)
直接计算数组 arr
的元素数量,同样输出 3。
2. std::empty
2.1 功能概述
std::empty
函数用于检查容器或数组是否为空。它会返回一个布尔值,若容器或数组为空则返回 true
,否则返回 false
。
2.2 示例代码
#include <vector>
#include <iostream>
int main() {
// 定义一个空的 vector 容器
std::vector<int> vec;
// 定义一个包含 3 个元素的数组
int arr[] = {1, 2, 3};
// 以文本形式输出布尔值
std::cout << std::boolalpha;
// 检查 vector 容器是否为空
std::cout << "Vector is empty: " << std::empty(vec) << std::endl;
// 检查数组是否为空
std::cout << "Array is empty: " << std::empty(arr) << std::endl;
return 0;
}
2.3 代码解释
代码中,std::empty(vec)
由于 vec
为空,所以返回 true
;std::empty(arr)
因为 arr
包含元素,所以返回 false
。std::boolalpha
用于以文本形式输出布尔值。
3. std::data
3.1 功能概述
std::data
函数用于获取容器或数组的底层数据指针。对于容器,它会返回容器的 data()
成员函数的结果;对于数组,它会返回数组的首地址。
3.2 示例代码
#include <vector>
#include <iostream>
int main() {
// 定义一个包含 3 个元素的 vector 容器
std::vector<int> vec = {1, 2, 3};
// 定义一个包含 3 个元素的数组
int arr[] = {4, 5, 6};
// 输出 vector 容器底层数据的第一个元素
std::cout << "Vector data: " << *std::data(vec) << std::endl;
// 输出数组底层数据的第一个元素
std::cout << "Array data: " << *std::data(arr) << std::endl;
return 0;
}
3.3 代码解释
std::data(vec)
返回 std::vector
底层数据的指针,*std::data(vec)
解引用该指针得到第一个元素的值 1;std::data(arr)
返回数组 arr
的首地址,*std::data(arr)
得到数组的第一个元素 4。
4. 使用场景
这些非成员函数的引入让代码更加通用和简洁。例如,std::size
和 std::empty
可以同时用于容器和数组,而无需区分具体类型。此外,只要自定义类型提供了相应的成员函数(如 size()
、empty()
、data()
),这些非成员函数同样可以支持自定义类型。
5. 注意事项
- 返回类型:
std::size
的返回类型为std::size_t
,std::empty
的返回类型为bool
。 - 数据有效性:
std::data
返回的是指向底层数据的指针,使用时需要确保数据的有效性,避免出现悬空指针等问题。
通过这些非成员函数,C++17 提供了一种更统一的方式来处理容器和数组,进一步增强了语言的表达能力和灵活性。