ホームページ > バックエンド開発 > C++ > データをコピーせずに C で複数のベクトルをソートするにはどうすればよいですか?

データをコピーせずに C で複数のベクトルをソートするにはどうすればよいですか?

DDD
リリース: 2024-12-05 02:24:09
オリジナル
752 人が閲覧しました

How Can I Sort Multiple Vectors in C   Without Copying Data?

コピーせずに 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&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)...));
}

int main() {

  typedef boost::tuple<int&amp;,double&amp;,long&amp;> 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>() << &quot; &quot; << t.get<1>() << &quot; &quot; << 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 サイトの他の関連記事を参照してください。

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