Boost または STL を使用した C での ZIP コンテナーのソート
同期された順序を維持しながら複数のコンテナーを同時にソートすることは、一般的な課題です。この質問では、Boost ライブラリと STL を使用した解決策を検討し、データをタプルまたは構造体にコピーする際の制限に対処します。
根本的な問題は、配列参照の「ペア」の動作にあり、規則に準拠していません。予想される反復子の特性。これにより、値型参照と参照型を効果的に分離する不適合イテレータの開発が促されました。
ブースト ソリューション
interjay からの受け入れられた回答は、「 tupleit.hh」ライブラリ。zip 形式のソートを可能にするカスタム タプル イテレータを提供します。
#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 ソリューション
代替アプローチSTL への拡張を提案する range-v3 ライブラリを利用すると、エレガントで簡潔な
#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; } }
混合コンテナに関する考慮事項
提示されたソリューションはシーケンスのようなコンテナの並べ替えに対処し、混合型 (リストなど) をサポートするように拡張します。およびシーケンス) を使用するには、特殊な BiDirectionalIterators の開発と、そのようなイテレータと互換性のあるソート アルゴリズムの実装が必要になります。ただし、STL の std::sort は双方向イテレータをサポートしていないことに注意してください。
結論として、Boost ソリューションと range-v3 ソリューションは両方とも、ロック ステップで複数のコンテナをソートする効率的でカスタマイズ可能な手段を提供し、オープンな方法を提供します。 C でのデータ操作の新たな可能性。
以上がBoost または Range-v3 を使用して C で ZIP 形式のコンテナーを並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。