From 7a349a948532446fe0a8a61afd783c58ba4269c2 Mon Sep 17 00:00:00 2001 From: Wenqing Wang <wenqing.wang@ufz.de> Date: Fri, 14 Oct 2016 15:19:53 +0200 Subject: [PATCH] [Base] Re-implemented reorderVector and its unit test --- BaseLib/reorderVector.h | 16 ++++++---------- Tests/BaseLib/TestreorderVector.cpp | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/BaseLib/reorderVector.h b/BaseLib/reorderVector.h index 9b541a5575f..7ec30155fb4 100644 --- a/BaseLib/reorderVector.h +++ b/BaseLib/reorderVector.h @@ -17,23 +17,19 @@ namespace BaseLib { /** - * Reorder a vector by a given index vector. - * From - * <a href="reorderV">http://stackoverflow.com/questions/838384/reorder-vector-using-a-vector-of-indices</a> + * Reorder a vector by a given index vector. * - * Note: The simple version on that page is taken, which is good enough in performance - * for medium size vectors. + * Note: It is good enough in performance for medium size vectors. */ template <typename ValueType, typename IndexType> void reorderVector(std::vector<ValueType>& v, std::vector<IndexType> const& order) { - for (std::size_t s = 1, d; s < order.size(); ++s) + std::vector<ValueType> temp_v = v; + + for (std::size_t i=0; i<order.size(); i++) { - for (d = order[s]; d < s; d = order[d]); - if (d == s) - while (d = order[d], d != s) - std::swap(v[s], v[d]); + v[i] = temp_v[order[i]]; } } diff --git a/Tests/BaseLib/TestreorderVector.cpp b/Tests/BaseLib/TestreorderVector.cpp index 4bc4f104695..3ed1029b4cc 100644 --- a/Tests/BaseLib/TestreorderVector.cpp +++ b/Tests/BaseLib/TestreorderVector.cpp @@ -12,6 +12,8 @@ */ #include <vector> +#include <algorithm> +#include <numeric> #include <gtest/gtest.h> @@ -19,12 +21,19 @@ TEST(BaseLib_reorderVector, testreorderVector) { - std::vector<double> vec {2016.0, 1996.0, 2006.0, 1986.0}; - std::vector<int> order {3, 1, 2, 0}; + const std::size_t size = 100; + std::vector<double> vec(size); + std::generate(vec.begin(), vec.end(), std::rand); + std::vector<double> vec0 = vec; + + std::vector<int> order(size); + std::iota(order.begin(), order.end(), 0); + std::random_shuffle(order.begin(), order.end()); + BaseLib::reorderVector(vec, order); - EXPECT_EQ(1986.0, vec[0]); - EXPECT_EQ(1996.0, vec[1]); - EXPECT_EQ(2006.0, vec[2]); - EXPECT_EQ(2016.0, vec[3]); + for (std::size_t i= 0; i<size; i++) + { + EXPECT_EQ(vec0[order[i]], vec[i]); + } } -- GitLab