std::distance
是 C++ 标准库中的一个函数模板,用于计算两个迭代器之间的距离。它的主要作用是返回从第一个迭代器到第二个迭代器之间的元素数量。这个函数对于不同类型的迭代器(如随机访问、双向、前向等)都能有效工作。
函数原型
template <class InputIterator>
typename std::iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);
参数
first
:指向范围起始位置的迭代器。last
:指向范围结束位置的迭代器。
返回值
- 返回一个类型为
difference_type
的值,表示两个迭代器之间的元素个数。对于随机访问迭代器,这个操作的时间复杂度为 O(1);而对于其他类型的迭代器,时间复杂度为 O(n),其中 n 是两个迭代器之间的元素数量。
使用场景
- 计算容器中元素的数量。
- 在需要确定两个迭代器之间的偏移量时。
示例代码
以下是一个使用 std::distance
的示例,展示了如何在不同类型的容器中使用它。
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
int main() {
// 使用 std::vector
std::vector<int> vec = {10, 20, 30, 40, 50};
auto startVec = vec.begin();
auto endVec = vec.end();
// 计算 vector 的大小
std::cout << "Distance in vector: " << std::distance(startVec, endVec) << std::endl;
// 使用 std::list
std::list<int> lst = {100, 200, 300, 400};
auto startList = lst.begin();
auto endList = lst.end();
// 计算 list 的大小
std::cout << "Distance in list: " << std::distance(startList, endList) << std::endl;
// 示例:计算迭代器之间的距离
auto it1 = vec.begin() + 1; // 指向 20
auto it2 = vec.begin() + 4; // 指向 50
std::cout << "Distance between it1 and it2: " << std::distance(it1, it2) << std::endl; // 输出: 3
return 0;
}
示例解释
- 向量示例:
- 创建一个整数向量
vec
,计算从vec.begin()
到vec.end()
之间的元素数量,输出结果为 5。
- 创建一个整数向量
- 列表示例:
- 创建一个整数列表
lst
,同样计算从lst.begin()
到lst.end()
之间的元素数量,输出结果为 4。
- 创建一个整数列表
- 迭代器之间的距离:
- 计算两个特定迭代器(指向 20 和 50)之间的距离,输出结果为 3。
总结
std::distance
是一个非常有用的函数,可以在各种容器中有效地计算迭代器之间的距离。它的灵活性和简单性使得它在 C++ 标准库中占据了重要的地位。使用时要注意不同迭代器的效率特性,以获得最佳性能。