为 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
实现了不同的方法,例如 add
、remove
等。我也超载了 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()
函数?
begin
和 end
需要 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; }
};
我有以下 class:
template<typename DataType>
class Bag
{
DataType* arr;
int len, real_size;
public:
// Class methods
};
我已经为 Bag
实现了不同的方法,例如 add
、remove
等。我也超载了 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()
函数?
begin
和 end
需要 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; }
};