gpt4 book ai didi

c++ - 如何正确实现 -> 和 (*)。这样它们的行为就像 -> 和 (*)。在迭代器中

转载 作者:行者123 更新时间:2023-11-28 01:24:27 25 4
gpt4 key购买 nike

我想为定制容器的迭代器实现 * 和 -> 运算符。我的代码无法编译。下面是一个“最小的非工作示例”,它显示了它如何与 std::map 一起工作,但在我的代码中没有。

#include <vector>
#include <map>
#include <iostream>

struct thing {
float f[1];
typedef std::pair<int,float> key_data;

struct iterator {
int pos;
const float *f;
key_data operator*() const { return key_data(pos,f[pos]); }
key_data *operator->() const { return &key_data(pos,f[pos]); }
};

iterator begin() const { return {.f = f, .pos = 0}; }
};

template<typename T> void test(T iter) {
(*iter).second = 1.0; std::cout << (*iter).second;

iter->second = 2.0; std::cout << iter->second;
}

int main() {
std::map<int,float> fmap; fmap[0] = 0.0;
test(fmap.begin());
std::cout << fmap[0];

thing f;
test(f.begin());
std::cout << f.f[0];
}

我希望编译 :),并打印 122122。编译时的错误信息是:

access.cc:13:43: error: taking the address of a temporary object of type 'key_data'
(aka 'pair<int, float>') [-Waddress-of-temporary]
key_data *operator->() const { return &key_data(pos,f[pos]); }

access.cc:20:18: error: expression is not assignable
(*iter).second = 1.0; std::cout << (*iter).second;

对于第一个:很公平,std::pair<> 创建了一个不能通过引用返回的临时对象;但是标准库如何做到这一点以允许使用通常的 -> 语法?

对于第二个:我可能又在尝试分配给临时对象,但我猜不出正确的语法是什么。

最佳答案

更简单的是在迭代器中直接拥有正确的类型:

struct thing {
float f[1];
using key_data = std::pair<int,float&>;

struct iterator {
key_data data;
const key_data& operator*() { return data; }
key_data *operator->() { return &data; }
};

iterator begin() { return {{0, f[0] }}; }
};

Demo

另一种解决方案是使用包装器,例如:

struct pair_wrapper
{
int &first;
float& second;

pair_wrapper* operator->() { return this; }
};

struct thing {
float f[1];
typedef std::pair<int,float> key_data;

struct iterator {
int pos;
float *f;
pair_wrapper operator*() { return pair_wrapper{pos,f[pos]}; }
pair_wrapper operator->() { return pair_wrapper{pos,f[pos]}; }
};

iterator begin() { return {0, f}; }
};

Demo

它使用 operator-> 的“魔法”链接。

关于c++ - 如何正确实现 -> 和 (*)。这样它们的行为就像 -> 和 (*)。在迭代器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54569284/

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