ホームページ > バックエンド開発 > C++ > Boost または STL を使用して、コピーせずに C で複数のベクトルを同時にソートするにはどうすればよいですか?

Boost または STL を使用して、コピーせずに C で複数のベクトルを同時にソートするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-10 13:14:14
オリジナル
835 人が閲覧しました

How Can I Sort Multiple Vectors in C   Simultaneously Without Copying, Using Boost or the STL?

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&amp;... 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート