首頁 > 後端開發 > C++ > 如何在不複製資料的情況下對C中的多個向量進行排序?

如何在不複製資料的情況下對C中的多個向量進行排序?

DDD
發布: 2024-12-05 02:24:09
原創
665 人瀏覽過

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

在不複製的情況下對C 中的壓縮容器進行排序

同時對多個向量進行排序而不創建副本提出了獨特的挑戰。現有的解決方案通常需要將資料複製到元組或結構中,這是低效的。本題探討了一種優雅的解決方案,利用 C 函式庫的強大功能來實現無需複製的排序。

問題:

目標是以鎖步對多個向量進行排序,確保對應的元素保持配對。複製向量是多餘且不可取的。

失敗的嘗試:

雖然boost::zip_iterator 和boost::range::algorithm::sort 看起來很有希望,但它們拒絕只讀和非隨機存取迭代器。

答案:

根據 interjay 的建議,使用「tupleit.hh」標頭中的自訂 TupleIteratorType 使我們能夠繞過內建迭代器的限制。這使我們能夠定義直接作用於壓縮向量的自訂排序函數。

這是一個示範:

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

此程式碼對向量進行就地排序,而不複製它們。使用自訂迭代器和“排序”函數可以處理所有必要的排列。

未來擴充:

目前解適用於序列容器。要將其擴展到可排序容器(例如列表),需要 RandomAccess 和雙向 TupleIterators,以及支援雙向迭代器的排序演算法。

以上是如何在不複製資料的情況下對C中的多個向量進行排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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