使用 Boost 或 STL 对 C 语言的压缩容器进行排序
同时对多个容器进行排序,同时保持其同步顺序是一个常见的挑战。本问题探索使用 Boost 库和 STL 的解决方案,解决将数据复制到元组或结构中的限制。
根本问题在于数组引用“对”的行为,它不遵守预期的迭代器特征。这促使开发非一致性迭代器,有效地将值类型引用与引用类型分离。
Boost 解决方案
interjay 接受的答案利用了“ tupleit.hh”库,它提供了自定义元组迭代器,可以对压缩文件进行排序容器。
#include "tupleit.hh" #include <vector> #include <iostream> #include <boost/range.hpp> #include <boost/range/algorithm/sort.hpp> // Custom zip function 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)...)); } int main() { // Example data std::vector<int> a = {1, 2, 3, 4}; std::vector<double> b = {11, 22, 33, 44}; std::vector<long> c = {111, 222, 333, 444}; // Sort zipped containers boost::sort(zip(a, b, c), [](auto& i, auto& j) { return i.get<0>() > j.get<0>(); }); // Print sorted results for (auto& tup : zip(a, b, c)) { std::cout << tup.get<0>() << " " << tup.get<1>() << " " << tup.get<2>() << std::endl; } return 0; }
此解决方案允许对序列容器进行排序,而无需将它们复制到单独的结构中。
Range-v3 解决方案
另一种方法利用 range-v3 库(该库提出了 STL 的扩展),提供了优雅而简洁的
#include <range/v3/all.hpp> #include <iostream> using namespace ranges; int main() { // Example data std::vector<int> a1{15, 7, 3, 5}; std::vector<int> a2{1, 2, 6, 21}; // Sort zipped containers sort(view::zip(a1, a2), std::less<>{}, &std::pair<int, int>::first); // Print sorted results for (auto& [x, y] : view::zip(a1, a2)) { std::cout << x << " " << y << std::endl; } }
混合容器的注意事项
虽然所提出的解决方案解决了类似序列容器的排序问题,但将它们扩展为支持混合类型(例如,列表)和序列)将需要开发专门的双向迭代器并实现与此类迭代器兼容的排序算法。不过,值得注意的是,STL 的 std::sort 不支持双向迭代器。
总之,Boost 和 range-v3 解决方案都提供了高效且可定制的方式来以锁步方式对多个容器进行排序,从而打开了C 中数据操作的新可能性。
以上是如何使用 Boost 或 Range-v3 对 C 中的压缩容器进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!