Cogs.Core
VectorPermutation.h
1#pragma once
2
3#include <algorithm>
4#include <numeric>
5#include <vector>
6
7namespace Cogs{
8 namespace Core {
9 namespace Permutation {
10
13
22 template <typename T, typename Compare>
23 std::vector<std::size_t> get_permutation(const std::vector<T>& vec, Compare compare)
24 {
25 std::vector<std::size_t> p(vec.size());
26 std::iota(p.begin(), p.end(), 0);
27 std::sort(p.begin(), p.end(),
28 [&](std::size_t i, std::size_t j) { return compare(vec[i], vec[j]); });
29 return p;
30 }
31
39 template <typename T>
40 void apply_permutation(std::vector<T>& vec, const std::vector<size_t>& p)
41 {
42 std::vector<bool> done(vec.size());
43 for (std::size_t i = 0; i < vec.size(); ++i)
44 {
45 if (done[i])
46 {
47 continue;
48 }
49 done[i] = true;
50 std::size_t prev_j = i;
51 std::size_t j = p[i];
52 while (i != j)
53 {
54 std::swap(vec[prev_j], vec[j]);
55 done[j] = true;
56 prev_j = j;
57 j = p[j];
58 }
59 }
60 }
61 }
62 }
63}
Contains all Cogs related functionality.
Definition: FieldSetter.h:23