gpt4 book ai didi

c++ - 返回迭代器以 boost 适配器转换的容器

转载 作者:太空狗 更新时间:2023-10-29 23:12:38 25 4
gpt4 key购买 nike

我想为类的用户提供迭代成员容器的可能性,但对元素应用转换。 Boost 适配器似乎非常适合转换容器,但我不知道如何将它应用到我的用例中。

该函数返回一个包含开始和结束迭代器的 IterPair 模板,并且它在没有转换的情况下工作。但是,通过转换,我返回了一对局部变量的迭代器。使转换后的容器成为成员是不可能的,因为它没有默认构造函数。

class A
{
public:
IterPair get_elems()
{
auto tr_vect = vect_ | boost::adaptors::transformed(std::mem_fn(&std::string::c_str));
return {std::begin(tr_vect), std::end(tr_vect)};
}
private:
std::vector<std::string> vect_;
}

最佳答案

我认为您可能没有正确地处理这个问题...而不是按照您所写的去做,我会提供以下方法,这确实是太多的代码,无法在快速的帖子中充实:

template <typename CONTAINER, // your underlying container
typename TRANSFORM> // functor for your transform
class transform_adaptor
{
template <typename IT = typename CONTAINER::iterator>
class proxy_iterator : private TRANSFORM {
// standard iterator typedefs, sourced from CONTAINER::iterator

typedef IT underlying_iterator;
underlying_iterator i;
public:
auto operator * () const -> decltype(TRANSFORM{}(*i))
{
return this->operator () (*i);
}
// Other proxy functions for the underlying iterator,
// i.e. operator++, etc
}

CONTAINER * cptr;
public:
typedef proxy_iterator iterator;
typedef proxy_iterator const_iterator;
// necessary value_type, iterator, allocator, etc adaptors here

iterator begin() { return proxy_iterator(cptr->begin()); }
iterator end() { return proxy_iterator(cptr->end()); }
};

我很抱歉几乎没有勾勒出它的骨架,但事实证明它比我现在希望编译和测试的代码要多得多...

想法是您创建一个包装器容器类,其中包含一个指向底层容器的迭代器代理以及一个指向底层容器的引用(指针)。当取消引用代理迭代器时,使用它的运算符*,它会对底层容器元素应用转换并返回其结果。

不足之处在于它破坏了 STL 的某些操作的 API,就像 std::vector<bool> 一样。破坏事物——如果没有更多的技巧和保证你可以将传输的结果类型反向映射回你的原始数据域(即你的转换是 1 到1,或双射)。因此,某些操作,如 std::sort 将在您的代理容器上失败,但如果您需要一个 const 容器在两个不同的 api 之间移动数据,它肯定是数据转换的一个很好的选择。

关于c++ - 返回迭代器以 boost 适配器转换的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44990169/

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