使用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中文網其他相關文章!