![](/img/trans.png)
[英]How can I create a container iterator with the container holding a policy type?
[英]How can I make an iterator over fields of container's items?
所以,比方说,我有一个在其中有std::list<std::pair<int, std::string>>
的类; 如何为此类实现迭代器,以便迭代此列表中包含的字符串?
或者,例如,在我的班级中,我有一个带有字段a
, b
和c
的struct
的向量; 我可以创建一个迭代器(也许继承向量的迭代器吗?不知道),当取消引用时,它将返回一个std::pair
,对应于(b, c)
?
通过迭代器,我的意思是像std::vector
的迭代器:我可以通过whatever.begin()
得到的whatever.begin()
,如上所述,迭代遍历列表中的字符串。
UPD好的,这里有关于我想要的更多信息。 在我的HashMap
类中,我有一些items
:一个structs
列表:每个structs
都有一个键,一个值和一个指向它在表中的位置的指针。 我需要的是一个迭代器; 但不是我可以通过执行items.begin()
获得的items.begin()
,因为这个迭代器在取消引用时会返回我的结构。 我需要一个迭代器,这样我可以在用户调用HashMap.begin()
时返回它,它应该取消引用到std::pair
,对应于(key,value)。
希望这应该让我的问题更清楚。
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_) {};
};
一种优雅的方法是使用转换迭代器或转换范围:
#include <iostream>
#include <list>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/iterator/transform_iterator.hpp>
int main() {
std::list<std::pair<int, std::string>> l;
auto extractor = [](auto&& elem) { return elem.second; };
// Using a transformed range.
for(auto&& v: l | boost::adaptors::transformed(extractor))
std::cout << v << '\n';
// Using transform iterators.
for(auto i = boost::make_transform_iterator(l.begin(), extractor), j = boost::make_transform_iterator(l.end(), extractor); i != j; ++i)
std::cout << *i << '\n';
}
要为容器使用转换迭代器,您可以执行以下操作:
struct MyContianer
{
std::list<std::pair<int, std::string>> container;
static auto constexpr first_extractor = [](auto&& elem) { return elem.second; };
using iterator_first = decltype(boost::make_transform_iterator(container.begin(), first_extractor));
iterator_first begin_first() { return {container.begin(), first_extractor}; }
iterator_first end_first() { return {container.end(), first_extractor}; }
static auto constexpr second_extractor = [](auto&& elem) { return elem.second; };
using iterator_second = decltype(boost::make_transform_iterator(container.begin(), second_extractor));
iterator_second begin_second() { return {container.begin(), second_extractor}; }
iterator_second end_second() { return {container.end(), second_extractor}; }
};
decltype(MyContianer::first_extractor) constexpr MyContianer::first_extractor;
decltype(MyContianer::second_extractor) constexpr MyContianer::second_extractor;
int main() {
MyContianer c;
c.begin_first();
c.begin_second();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.