gpt4 book ai didi

c++ - 了解运算符重载和迭代器为什么会打印出 “wrhrwwr”?

转载 作者:行者123 更新时间:2023-12-02 10:21:37 28 4
gpt4 key购买 nike

在以下代码中,输出为“wrhrwwr”,我尝试了解迭代器在做什么,以及“++”如何重载。似乎它以某种方式跳过了“e”。但是,代码对我来说还不太清楚,也许我可以帮上忙。
谢谢

#include <iostream> 

using namespace std;

class datas {
private:
const char *string,marker;
const int len;
public:
class hophop {
private:
const char *pos, next;
public:
char operator *() { return *pos; }
hophop operator ++() {++pos;while (*(pos+1)!=next) ++pos; return *this; }
bool operator !=(hophop &o) { return pos < o.pos; }
hophop(const char *p, char m) : pos(p),next(m) {}
};
typedef hophop iterator;
iterator begin() { return hophop (string, marker); }
itrator end () { return hophop(string +len ,marker); }
datas(const char *d,int l, char m) : string (d), len(l),marker(m){}
};

int main( void ) {

datas chars ("we are where we were", 20, 'e');
for (char c: chars)
cout << c;

return 0;
}

最佳答案

通过将hophopdatas类中拉出,将更容易看到。现在您可以看到hophop构造函数及其最新功能。我将删除++operator的返回值,将其设置为void,以指出它在这里没有任何作用。

#include <iostream> 
class hophop {
private:
const char* pos, next;
public:
hophop(const char* p, char m) : pos(p), next(m) {}

char operator *() { return *pos; }
hophop operator ++() {
++pos;
while (*(pos + 1) != next)
++pos;
return *this;
}
bool operator !=(const hophop& o) { return pos < o.pos; }
};

class datas {
private:
using iterator = hophop;
const char* string, marker;
const int len;

public:
datas(const char* d, int l, char m) : string(d), len(l), marker(m) {}

iterator begin() { return hophop(string, marker); }
iterator end() { return hophop(string + len, marker); }
};

int main(void) {

datas chars("we are where we were", 20, 'e');
// w r h r w w r
for (char c : chars)
std::cout << c;

std::cout << "\nusing a non range based for loop:" << std::endl;

for (hophop it = chars.begin(); it != chars.end(); ++it)
std::cout << *it;

std::cout << "\nor where the return value could be used:" << std::endl;
auto it = chars.begin();
std::cout << *it;
for (; it != chars.end();)
std::cout << *++it;
}

因此,现在可以更容易地了解Hophop ++运算符的工作方式。 operator *()在循环开始时被调用,因此无论第一个字符是什么,都将对其进行检索。然后调用 ++operator,它将迭代器至少向前移动一次,直到匹配 next为止。然后返回匹配之前的字符。查看main中的评论。返回 e之前的第一个字符。

如果您没有太多使用调试器,则应该使用。通过在 operator++中放置一个断点,您可以看到正在发生的事情。

更新

我之前已将 ++operator的返回值设置为void。正如@JaMiT所指出的,运算符(operator)应该返回 *this。我还添加了两个循环,它们应该比使用基于范围的循环更清晰。第三个示例实际上使用了 ++operator的返回值,而前两个循环则没有。

并且,养成不使用 using namespace std;的习惯,它将使您免于以后的麻烦。

关于c++ - 了解运算符重载和迭代器为什么会打印出 “wrhrwwr”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59905140/

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