gpt4 book ai didi

c++ - 自定义迭代器上的前缀和后缀++做同样的事情

转载 作者:搜寻专家 更新时间:2023-10-30 23:48:18 25 4
gpt4 key购买 nike

首先,我是 C++ 的新手,所以如果这是初学者的编码错误,我很抱歉。

我目前正在为我在学校得到的家庭作业上图形课。我应该能够将边存储在集合、数组和链表中。由于我在单独的类(class)中完成了所有这些工作,因此我现在正试图通过模板化使它们全部工作。一切都适用于 ie。 std::set,但是当我使用我自己的链表实现时,它以某种方式失败了——看起来我的迭代器在某处搞砸了,它们的前缀和后缀运算符导致相同的行为(在 for 循环中)。我还要补充一点,我没有使用 std::list,因为我应该自己实现链表。

我当前的迭代器实现:

template<typename T>
class Iterator{
public: node<T>* pointer;
public:
Iterator(): pointer(0){}
Iterator(node<T>* _pointer): pointer(_pointer){}

Iterator<T> operator++() { pointer = pointer->next; }
Iterator<T> operator++(int) { pointer = pointer->next; }

bool operator!=(Iterator<T> rval){ return !(pointer == rval.pointer); }
bool operator==(Iterator<T> rval){ return (pointer == rval.pointer); }

node<T>* operator()(){ return pointer; }

T operator*(){ return pointer->data; }

};

单链表节点:

template <typename T>
struct node{
node(): next(0){}
node(T val): data(val), next(0){}
node(node<T>* _next): data(0), next(_next){}
node(T val, node<T>* _next): data(val), next(_next){}

T data;
node<T>* next;
};

以及我的列表类如何实现 begin() 和 end():

typedef Iterator<T> iterator;
iterator begin() { return iterator(new node<T>(b)); }
iterator end() { return iterator(); }

请注意 b指向链表中的第一个元素

最后是我如何访问元素(这是在包含列表的不同类中):

void tree_recurse_f(int node, std::ofstream* file, int level = 0){
[some output code here]
typename T::iterator it;
for (it = Database[node].first.begin(); it != Database[node].first.end(); ++it){
tree_recurse_f(*it, file, (level+1));
}
}

Database是一个 std::map<int,std::pair<>>.first指向 T 指定的类型(集合、列表或 vector )

现在解决问题:

  1. 以某种方式与列表的当前实现'begin() , 它指向输出函数中的一个空节点(++it 和 it++ 结果相同)
  2. 更改 begin()return iterator(b)似乎消除了 for 循环中的错误,尽管++it 和 it++ 的结果相同
  3. 我已经通过仅测试列表类设法发现了这两个错误 - 如果我将它实现到绘图类中,它会在输出函数中进入一个永无止境的循环(*它总是指向 0 而且似乎没有增加++it)

在我看来,迭代器有些奇怪(尤其是它单独工作,但在另一个类中不起作用)

//如果有人好奇,我会大致遵循 http://www.cplusplus.com/articles/Lw6AC542/ 上的链表教程。

最佳答案

您的前缀和后缀运算符执行相同的操作,因为您将它们定义为执行相同的操作:

Iterator<T> operator++()    { pointer = pointer->next; }
Iterator<T> operator++(int) { pointer = pointer->next; }

代码是相同的,但最重要的是,它有未定义的行为,因为您的函数应该返回类型为Iterator<T> 的值。相反,它们什么也不返回。根据 C++11 标准的第 6.6.3/2 段:

[...] Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

你应该把你的前缀迭代器改成这样:

Iterator<T> operator++() 
{
pointer = pointer->next;
return *this;
}

和你的后缀迭代器变成这样的东西:

Iterator<T> operator++(int) 
{
node<T>* previous = pointer;
pointer = pointer->next;
return Iterator<T>(previous);
}

此外,如果我正确理解您的设计,我真的认为您不应该这样做:

iterator begin() { return iterator(new node<T>(b)); }

我宁愿做:

iterator begin() { return iterator(b); }

关于c++ - 自定义迭代器上的前缀和后缀++做同样的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122764/

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