为 class 创建合适的 begin() 和 end() 函数

Creating a suitable begin() and end() function for a class

我有以下 class:

template<typename DataType>
class Bag
{
    DataType* arr;
    int len, real_size;
public:
    // Class methods
};

我已经为 Bag 实现了不同的方法,例如 addremove 等。我也超载了 operator[].

在测试时,我想打印类型为 Bag 的对象的所有元素。所以我尝试了这个:

#include <iostream>

#include "bag.h"

int main()
{
    sgl::Bag<int> bag{};
    
    bag.add(12);
    bag.add(14);
    bag.add(16, 0);

    for (auto& i : bag) // this range-based 'for' statement requires a suitable "begin" function and none was found
    {

    }
}

当我收到这个错误时,我尝试这样实现 begin()end()

DataType begin()
{
    return arr[0];
}
DataType end()
{
    return arr[len - 1];
}

但随后出现以下错误:

the iterator type in this range-based 'for' statement is "int", which is not a pointer type or an iterator-like class type

所以我的问题是如何为我的 class Bag 正确实现合适的 begin()end() 函数?

beginend 需要 return iterators/pointers 到第一个和最后一个+1 元素,而你 return 第一个和最后一个元素.

DataType *begin() const { return arr; }
DataType *end() const { return arr+len; }

应该可以,假设 len 是数组中的元素数。


注意: end 需要指向 beyond 数组的最后一个元素,而不是 at 最后一个元素。请参阅 cppreference。

我会将这 6 个成员函数添加到 Bag 以使其在 const 和非 const 上下文中可用:

template<typename DataType>
class Bag
{
    DataType* arr;
    int len, real_size;
public:
    using iterator = DataType*;
    using const_iterator = const DataType*;

    // Class methods
    const_iterator cbegin() const { return arr; }
    const_iterator cend() const { return arr + len; }
    const_iterator begin() const { return cbegin(); }
    const_iterator end() const { return cend(); }
    iterator begin() { return arr; }
    iterator end() { return arr + len; }
};