制作迭代器适配器
首先,最简单的解决方案是遍历容器并从迭代器中访问字段。
for (auto&& r : records) {
int value = r.field1;
}
无论如何,如果您确实希望在解除引用时返回
field1
的迭代器,则可以轻松地实现一个迭代器适配器,该适配器派生自容器自己的迭代器。
struct my_it : public std::vector<record>::iterator {
using std::vector<record>::iterator::iterator;
int operator*() { return std::vector<record>::iterator::operator*().field1; }
};
并按照以下方式使用:
for (my_it it = std::begin(records); it != std::end(records); ++it) {
int value = *it;
}
这是XY问题吗?
正如Ben Voigt所解释的那样,无法创建一个可以迭代连续数组中存储的类型为int
以外元素的std::vector<int>::iterator
。
如果需要一个接受输入迭代器的函数,则应将其制作为模板函数。这样它就可以与任何容器类型的迭代器一起工作。这是标准库中所有算法实现的方式。
template <typename InputIt>
void func(InputIt first, InputIt last) {
for (; first != last; ++first) {
value = *it;
}
}
迭代器应该通过它们的操作(即读取、增加、减少、随机访问),而不是它们的显式类型来进行接口化。迭代器按它们支持的操作数量进行分类。
例如,如果您需要在一个范围内进行迭代并一次性读取所有值,则需要使用输入迭代器作为参数。迭代器本身的类型应该是无关紧要的。
有关迭代器类别的更多信息,请参见此处
vector<int>::iterator
的begin
和end
迭代器。我已经在我的代码的其他部分中使用它,传递实际vector<int>
的迭代器。 - Brianint
表示时钟跳跃,所以我在考虑做一个继承的事情,但我不想创建一个只有 1 个字段的结构体,你知道吗? - Brianclass X
派生自struct Y
并不意味着std::vector<X>
和std::vector<Y>
之间有任何联系。 - Ben Voigt