我希望我的函数能够将 array.begin() 和 array.end() 作为参数。据我了解,开始/结束函数返回指向数组第一个/最后一个元素的指针。那为什么下面的代码不起作用呢?我应该如何编写代码?
#include <iostream>
#include <array>
template<class T> void foo(const T* begin, const T* end) {
...
}
int main() {
std::array<int, 5> arr = { 1, 2, 3, 4, 5 };
foo(arr.begin(), arr.end()); // <-- error!
return 0;
}
最佳答案
As far as I understand, the begin/end functions return a pointer to the first/last element of the array
没有。 begin
和 end
返回迭代器。标准库使用迭代器。迭代器是指针的概括。
迭代器的行为类似于指针,您可以像指针一样使用它们(例如 *it
来访问元素),但有一些注意事项:并非所有迭代器都具有指针所做的所有操作。指针满足随机访问迭代器的概念,因此在某些实现中,std::array
的迭代器可能只是指针类型的别名,但您不能依赖它。例如。在同一个编译器上,它可以是发布版本的指针,但可以是调试版本的完整类。
惯用的方式是这样写:
template<class It>
void foo(It begin, It end) {
for (auto it = begin; it != end; ++it) {
const auto& elem = *it;
// ..
}
}
从 C++20 开始,我们应该从迭代器对过渡到 ranges :
void foo(std::ranges::range const auto& r) {
for (const auto& elem : r) {
// ...
}
}
关于接受 array.begin() 和 array.end() 作为参数的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70311357/