Boost または STL を使用した C での ZIP コンテナーの並べ替え
はじめに
この質問は、複数のベクトルまたはコンテナをコピーせずにそれらの要素の対応を維持しながら並べ替えるという課題。目標は、タプルやその他の一時的なデータ構造に依存せずにこれを達成することです。
元の質問
元の質問では、3 つのベクトルを並べ替えるという特定のタスクが提示されています。各ベクトルの要素が同じ順序で並べ替えられることを確認します。ベクトルをタプルにコピーしたり、カスタムの並べ替え関数を実装したりすることは明示的に除外されます。 boost::zip_iterator または boost::zip_range を使用しようとしましたが、イテレータの読み取り専用および非ランダム アクセスの性質により失敗しました。
回答
A実用的なソリューションは、tupleit.hh を利用して interjay によって提供されました。 library:
// tupleit.hh included for custom tuple iterators #include <tupleit.hh> 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)...)); }
このテンプレート関数は、コンテナを結合してタプル反復子のように動作する boost::iterator_range にし、boost::sort:
boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); });
を使用してソートできるようにします。今後の考慮事項
この答えはシーケンス コンテナーに対して機能します (例:ベクトル) ですが、random_access と双方向 TupleIterators を必要とするソート可能なコンテナに拡張することが望ましいでしょう。ただし、標準のソート アルゴリズムは現在、BidirectionIterators をサポートしていません。
Update
シーケンスのようなコンテナ (シーケンスとリストなど) の混合は現在可能です。ただし、リストを組み込むには、BidirectionIterators で動作するソート アルゴリズムが必要ですが、現在標準ライブラリでは利用できません。
以上がBoost または STL を使用して、コピーせずに C で複数のベクトルを同時にソートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。