コピーせずに C で圧縮されたコンテナを並べ替える
コピーを作成せずに複数のベクトルを同時に並べ替えるには、独特の課題が生じます。既存のソリューションでは、多くの場合、データをタプルまたは構造体に複製する必要があり、非効率的です。この質問では、C ライブラリの機能を活用して、コピーせずにソートを実現するエレガントなソリューションを探ります。
問題:
目標は、ロックステップで複数のベクトルをソートすることです。 、対応する要素がペアのままであることが保証されます。ベクトルのコピーは冗長であり、望ましくありません。
失敗した試行:
boost::zip_iterator と boost::range::algorithm::sort は有望に見えますが、それらは読み取り専用アクセスと非ランダムアクセスを拒否するiterators.
答え:
interjay が提案しているように、「tupleit.hh」ヘッダーのカスタム TupleIteratorType を使用すると、組み込みの制限をバイパスできます。イテレータ。これにより、zip 圧縮されたベクトルに対して直接動作するカスタム ソート関数を定義できます。
デモを次に示します:
#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; }
このコードは、ベクトルをコピーせずにその場で並べ替えます。カスタム反復子と「sort」関数を使用すると、必要なすべての置換が処理されます。
将来の拡張:
現在のソリューションは、シーケンス コンテナーに対して適切に機能します。これをリストなどの並べ替え可能なコンテナーに拡張するには、双方向イテレーターをサポートする並べ替えアルゴリズムに加えて、RandomAccess と双方向 TupleIterators が必要になります。
以上がデータをコピーせずに C で複数のベクトルをソートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。