使用 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&... 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中文网其他相关文章!