首頁 > 後端開發 > C++ > 如何使用 Boost 或 Range-v3 對 C 中的壓縮容器進行排序?

如何使用 Boost 或 Range-v3 對 C 中的壓縮容器進行排序?

DDD
發布: 2024-12-07 01:35:12
原創
328 人瀏覽過

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

使用Boost 或STL 對C 語言的壓縮容器進行排序

同時對多個容器進行排序,同時保持其同步順序是一個常見的挑戰。本問題探討使用 Boost 函式庫和 STL 的解決方案,解決將資料複製到元組或結構中的限制。

根本問題在於陣列引用「對」的行為,它不遵守預期的迭代器特徵。這促使開發非一致性迭代器,有效地將值類型引用與引用類型分開。

Boost 解決方案

interjay 接受的答案利用了「 tupleit.hh」庫,它提供了自訂元組迭代器,可以對壓縮檔案進行排序容器。

#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 解

另一種方法是利用 range-v3 函式庫(該函式庫提出了 STL的擴展),提供了優雅而簡潔的

#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;
  }
}
登入後複製

混合容器的注意事項

雖然所提出的解決方案解決了類似序列容器的排序問題,但將它們擴展為支援混合類型(例如,列表)和序列)將需要開發專門的雙向迭代器並實現與此類迭代器相容的排序演算法。不過,值得注意的是,STL 的 std::sort 不支援雙向迭代器。

總之,Boost 和 range-v3 解決方案都提供了高效且可自訂的方式來以鎖定方式對多個容器進行排序,從而開啟了C 中資料操作的新可能性。

以上是如何使用 Boost 或 Range-v3 對 C 中的壓縮容器進行排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板