5#ifndef RSMESH_ZIP_SORT_H
6#define RSMESH_ZIP_SORT_H
11#include <common/macros.h>
18 template <
class RandomAccessIterator,
19 class D =
typename std::iterator_traits<RandomAccessIterator>::difference_type>
20 static void inverse_permute(RandomAccessIterator begin, RandomAccessIterator end,
21 const std::vector<D>& p) {
23 auto size = std::distance(begin, end);
25 std::vector<bool> done(size);
26 for(D i = 0; i < size; i ++) {
35 swap(begin[prev_j], begin[j]);
44 template <
class RandomAccessIterator1,
class RandomAccessIterator2,
class Compare>
45 void zip_sort(RandomAccessIterator1 begin1, RandomAccessIterator1 end1,
46 RandomAccessIterator2 begin2, RandomAccessIterator2 end2, Compare compare) {
47 using D1 =
typename std::iterator_traits<RandomAccessIterator1>::difference_type;
48 using D2 =
typename std::iterator_traits<RandomAccessIterator2>::difference_type;
50 static_assert(std::is_same<D1, D2>::value,
51 "RandomAccessIterator1 and RandomAccessIterator2 must have the same difference_type.");
52 RSMESH_ASSERT(std::distance(begin1, end1) == std::distance(begin2, end2));
54 auto size = std::distance(begin1, end1);
56 std::vector<D1> permutation(size);
57 std::iota(begin(permutation), end(permutation), 0);
58 std::sort(begin(permutation), end(permutation), [&](
int i,
int j) {
59 return compare(std::make_pair(begin1[i], begin2[i]), std::make_pair(begin1[j], begin2[j]));
62 detail::inverse_permute(begin1, end1, permutation);
63 detail::inverse_permute(begin2, end2, permutation);
本系统的主命名空间,包含了common, examples, fmm, geometry, numeric, point_cloud等子命名空间