gpt4 book ai didi

c++ - 如何在容器项目的字段上创建迭代器?

转载 作者:太空狗 更新时间:2023-10-29 22:59:28 24 4
gpt4 key购买 nike

所以,比方说,我有一个类有 std::list<std::pair<int, std::string>>在里面;我怎样才能为这个类实现一个迭代器,以便它迭代这个列表中包含的字符串?

或者,例如,在我的课上我有一个 vector struct s 与字段 a , bc ;我可以创建一个迭代器吗(也许继承 vector 的迭代器?不知道),当取消引用时,它将返回 std::pair ,对应(b, c)

我所说的迭代器是指类似 std::vector 的东西的迭代器:我可以通过 whatever.begin() 得到的东西如前所述,并迭代列表中的字符串。

UPD 好的,这是我想要的更多信息。在我的 HashMap我有课items : structs 的列表:每个都有一个键,一个值和一个指向它在表中的位置的指针。我需要的是一个迭代器;但不是我可以通过做得到的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();
}

关于c++ - 如何在容器项目的字段上创建迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36824062/

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