在不複製的情況下對C 中的壓縮容器進行排序
同時對多個向量進行排序而不創建副本提出了獨特的挑戰。現有的解決方案通常需要將資料複製到元組或結構中,這是低效的。本題探討了一種優雅的解決方案,利用 C 函式庫的強大功能來實現無需複製的排序。
問題:
目標是以鎖步對多個向量進行排序,確保對應的元素保持配對。複製向量是多餘且不可取的。
失敗的嘗試:
雖然boost::zip_iterator 和boost::range::algorithm::sort 看起來很有希望,但它們拒絕只讀和非隨機存取迭代器。
答案:
根據 interjay 的建議,使用「tupleit.hh」標頭中的自訂 TupleIteratorType 使我們能夠繞過內建迭代器的限制。這使我們能夠定義直接作用於壓縮向量的自訂排序函數。
這是一個示範:
#include "tupleit.hh" #include <vector> #include <iostream> #include <boost/range.hpp> #include <boost/range/algorithm/sort.hpp> #include <boost/range/algorithm/for_each.hpp> 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() { typedef boost::tuple<int&,double&,long&> tup_t; std::vector<int> a = { 1, 2, 3, 4 }; std::vector<double> b = { 11, 22, 33, 44 }; std::vector<long> c = { 111, 222, 333, 444 }; auto print = [](tup_t t){ std::cout << t.get<0>() << " " << t.get<1>() << " " << t.get<2>() << std::endl; }; boost::for_each( zip(a, b, c), print); boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); }); for ( auto tup : zip(a, b, c) ) print(tup); return 0; }
此程式碼對向量進行就地排序,而不複製它們。使用自訂迭代器和“排序”函數可以處理所有必要的排列。
未來擴充:
目前解適用於序列容器。要將其擴展到可排序容器(例如列表),需要 RandomAccess 和雙向 TupleIterators,以及支援雙向迭代器的排序演算法。
以上是如何在不複製資料的情況下對C中的多個向量進行排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!