gpt4 book ai didi

C++ 迭代器返回类型

转载 作者:行者123 更新时间:2023-11-28 02:00:35 25 4
gpt4 key购买 nike

我以前从未使用过迭代器,而且我在为我编写的自定义容器类设计自定义迭代器时遇到了问题。

背景:使用 Google Tests API,这是我拥有的两个测试用例:

TEST(RandomArray, End) {
RandomArray r(17);
int *b = r.begin();
int *e = r.end();
EXPECT_EQ(b + 17, e);
}

TEST(RandomArray, IteratorTypedef) {
RandomArray r(7);
for (RandomArray::iterator it = r.begin(); it != r.end(); ++it) {
*it = 89;
EXPECT_EQ(89, *it);
}
}

这是我的头文件和迭代器的代码:

class RandomArray
{
friend ostream& operator<<(ostream&, const RandomArray&);

public:
class iterator
{
public:
typedef iterator self_type;
typedef int* pointer;
typedef int& reference;
self_type operator++() { self_type i = *this; ptr++; return i;}
reference operator*() {return *ptr;}
bool operator!=(const self_type& rhs) {return ptr != rhs.ptr;}
private:
pointer ptr;
};

class const_iterator
{
public:
typedef const_iterator self_type;
typedef int* pointer;
typedef int& reference;
self_type operator++() { self_type i = *this; ptr++; return i;}
const reference operator*() { return *ptr; }
bool operator!=(const self_type& rhs) {return ptr != rhs.ptr;}
private:
pointer ptr;
};

RandomArray();

RandomArray(size_t);

size_t size() const;

int* begin();
iterator begin();

const int* begin() const;
const iterator begin() const;

int* end();
iterator end();

const int* end() const;
const iterator end() const;
private:
size_t capacity;
int* data;
};

我在开始和结束时遇到的错误如下:错误:无法重载仅由返回类型区分的函数。

我知道不允许使用相同的函数名称和相同的参数但返回类型不同,所以我想知道是否有更好的方法来做到这一点?我使迭代器正确吗?模板会帮助解决这个问题吗?我需要 begin()end() 来返回 int*iterator 这样我就可以通过两个测试用例。有没有更好的方法来实现这一点?

最佳答案

I need begin() and end() to return both an int* and an iterator so I can pass both test cases.

不,你不知道。期望指针的测试用例是错误的。容器还给你迭代器。在您的情况下,您的迭代器可以一个指针,但这是一个实现细节。你绝对只是想要:

iterator begin();
const_iterator begin() const; // NB: const_iterator, not const iterator

然后修复您的单元测试以期望 RandomArray::iterator 而不是 int*。或者,更好的是 auto


注意:您的operator++() 执行后缀递增而不是前缀递增。此外,const reference 是错误的类型,应该是 int& const,而引用本质上是 const。您想要将 reference 的 typedef 更改为 int const&

关于C++ 迭代器返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39773526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com