首页 >后端开发 >C++ >如何使用 Boost 或 STL 在 C 语言中同时对多个向量进行排序而不进行复制?

如何使用 Boost 或 STL 在 C 语言中同时对多个向量进行排序而不进行复制?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-10 13:14:14838浏览

How Can I Sort Multiple Vectors in C   Simultaneously Without Copying, Using Boost or the STL?

使用 Boost 或 STL 对 C 语言中的压缩容器进行排序

简介

此问题探讨将多个向量或容器排序在一起,保持它们的元素对应关系而不复制它们的挑战。目标是在不依赖元组或其他临时数据结构的情况下实现这一目标。

原始问题

原始问题提出了一个特定的任务:对三个向量进行排序,同时确保每个向量中的元素以相同的顺序重新排列。它明确排除将向量复制到元组中或实现自定义排序函数。由于迭代器的只读和非随机访问性质,尝试使用 boost::zip_iterator 或 boost::zip_range 失败。

答案

A工作解决方案由 interjay 提供,利用 tupleit.hh库:

// tupleit.hh included for custom tuple iterators
#include <tupleit.hh>

template <typename... T>
auto zip(T&amp;... containers)
    -> boost::iterator_range<decltype(iterators::makeTupleIterator(std::begin(containers)...))> {
  return boost::make_iterator_range(iterators::makeTupleIterator(std::begin(containers)...),
                                      iterators::makeTupleIterator(std::end(containers)...));
}

此模板函数将容器组合成 boost::iterator_range,其行为类似于元组迭代器,允许使用 boost::sort:

boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); });

进行排序未来的考虑因素

答案适用于序列容器(例如向量),但它会最好将其扩展到可排序容器,这需要 random_access 和双向 TupleIterators。但是,标准排序算法目前不支持双向迭代器。

更新

目前可以混合类似序列的容器(例如序列和列表)。然而,合并列表需要一个在双向迭代器上运行的排序算法,而该算法目前在标准库中不可用。

以上是如何使用 Boost 或 STL 在 C 语言中同时对多个向量进行排序而不进行复制?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn