接受 array.begin() 和 array.end() 作为参数的 C++ 函数

标签 c++

我希望我的函数能够将 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

没有。 beginend 返回迭代器。标准库使用迭代器。迭代器是指针的概括。

迭代器的行为类似于指针,您可以像指针一样使用它们(例如 *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/

相关文章:

c++ - 如何将静态常量变量保留为类的成员

c++ - OS X 上的 OpenMP 汇编程序错误

C++析构函数问题

c++ - 如何在 Thunderbird 中监听 'SendMail' 事件?

c++ - 检查map<string, string>是否包含另一个map<string, string>

c++ - 使子类可以调用彼此的共享成员变量

c++ - QSqlDatabasePrivate::addDatabase: 重复的连接名称 'MyConnection' 错误

c++ - 移动构造对象的 GCC 奇怪行为

c++ - C++ 中的 N Queens 使用 vector

c++ - 在 rcpp 中将列表转换为矩阵