ホームページ >バックエンド開発 >C++ >Boost または Range-v3 を使用して C で ZIP 形式のコンテナーを並べ替えるにはどうすればよいですか?

Boost または Range-v3 を使用して C で ZIP 形式のコンテナーを並べ替えるにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-07 01:35:12312ブラウズ

How to Sort Zipped Containers in C   Using Boost or Range-v3?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。