【发布时间】:2016-04-24 13:57:36
【问题描述】:
比如说,我有一个类,里面有std::list<std::pair<int, std::string>>;我怎样才能为这个类实现一个迭代器,以便它迭代这个列表中包含的字符串?
或者,例如,在我的班级中,我有一个structs 的向量,其中包含a、b 和c 字段;我可以创建一个迭代器(可能继承vector的迭代器?不知道),它在取消引用时会返回一个std::pair,对应于(b, c)?
我所说的迭代器是指类似于std::vector 的迭代器:我可以通过whatever.begin() 获取并迭代(如上所述)列表中的字符串。
UPD 好的,这里有更多关于我想要的信息。在我的HashMap 类中,我有items:structs 的列表:每个都有一个键、一个值和一个指向它在表中位置的指针。我需要的是一个迭代器;但不是我可以通过items.begin() 获得的那个,因为这个迭代器在取消引用时将返回我的结构。我需要一个迭代器,这样当用户调用HashMap.begin() 时我可以返回它,并且它应该取消引用到一个std::pair,对应于(键,值)。
希望这能让我的问题更清楚。
UPD2
这是我的struct,如果有帮助的话:
template<class KeyType, class ValueType>
struct node {
KeyType key;
ValueType value;
node** place;
node(KeyType key_ = KeyType(), ValueType value_ = ValueType()): key(key_), value(value_) {};
};
【问题讨论】:
-
您不能使用任意结构定义。这将需要运行时反射,这在 c++ 中不可用。您可以为每个需要使用它的具体结构提供自己的迭代器实现。可能是
std::tie()在这样做时很有用。 -
您要遍历列表中的字符串还是其他内容?
-
您应该解释为什么您需要这样的迭代器,因为可能有其他方法可以做到这一点。
-
@Galik 准确地说,是的
-
但是您仍然可以使用列表迭代器访问列表中的
std::string实例并执行操作it->second,除非我完全误解了这个问题