gpt4 book ai didi

c++ 容器容器的通用 `flatten`

转载 作者:行者123 更新时间:2023-11-27 23:53:07 28 4
gpt4 key购买 nike

我有兴趣实现一个通用的 flatten一个容器的容器

为了简化,我会使用自己的容器。主要原因是标准容器接收分配器的附加模板参数,这对我编写操作来说更复杂。因此,考虑容器 Vector<T> , List<T>等让人想起标准容器,只是它们不需要分配器。

现在,我有一个可操作的 flatten操作直到四个级别如下:

template <typename T,
template <typename> class Container1,
template <typename> class Container2>
List<T> flatten(const Container1<Container2<T>> & c)
{
List<T> ret;
for (auto & l : c)
for (auto & item : l)
ret.push_back(item);

return ret;
}

template <typename T,
template <typename> class Container1,
template <typename> class Container2,
template <typename> class Container3>
List<T>
flatten(const Container1<Container2<Container3<T>>> & c)
{
List<T> ret;
for (auto & l : c)
ret.splice(ret.end(), flatten(l));

return ret;
}

template <typename T,
template <typename> class Container1,
template <typename> class Container2,
template <typename> class Container3,
template <typename> class Container4>
List<T> flatten // and so on for more levels ...

我的问题是:

  1. 是否存在一种更简洁、特别是通用的方法,允许任意数量的级别,可能基于更优雅的元编程,或者可能使用宏来编写此操作?
  2. 如果前面的问题是肯定的,那么有人可以总结一下怎么可能吗?
  3. 有什么方法可以至少将这种技术应用于标准容器?正如我所说,是什么让我的 flatten 变得复杂了?标准容器上的版本是这些容器接收分配器作为模板参数。

最佳答案

最简单的方法是递归地展平容器:

template<typename Container, typename T>
void flatten_impl(Container const& c, List<T>& out)
{
for(auto const& elem : c) flatten(elem, out);
}

显然,与任何递归一样,您也需要终止此递归:

template<typename Elem, typename T>
void flatten_impl(Elem e, List<T>& out)
{
out.push_back(e);
}

由于这些现在有歧义,您需要解决歧义:

template<typename Elem, typename T>
void flatten_impl(Elem e, List<T>& out, ...)
{
out.push_back(e);
}
template<typename Container, typename T>
std::void_t<typename Container::value_type> flatten_impl(Container const& c, List<T>& out)
{
for(auto const& elem : c) flatten(elem, out);
}

关于c++ 容器容器的通用 `flatten`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44792464/

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