Use std::adjacent_find instead of std::unique When detecting duplicates, it is more efficient to use std::adjacent_find than it is to use std::unique. Change-Id: Ib6b4671c10848bb7dd10aa7a1baeffc8c9c825b5
diff --git a/internal/ceres/local_parameterization.cc b/internal/ceres/local_parameterization.cc index 8200476..9e05cba 100644 --- a/internal/ceres/local_parameterization.cc +++ b/internal/ceres/local_parameterization.cc
@@ -30,6 +30,7 @@ #include "ceres/local_parameterization.h" +#include <algorithm> #include "ceres/householder_vector.h" #include "ceres/internal/eigen.h" #include "ceres/internal/fixed_array.h" @@ -98,7 +99,7 @@ vector<int> constant = constant_parameters; sort(constant.begin(), constant.end()); - CHECK(unique(constant.begin(), constant.end()) == constant.end()) + CHECK(std::adjacent_find(constant.begin(), constant.end()) == constant.end()) << "The set of constant parameters cannot contain duplicates"; CHECK_LT(constant_parameters.size(), size) << "Number of parameters held constant should be less "
diff --git a/internal/ceres/problem_impl.cc b/internal/ceres/problem_impl.cc index 8547d5d..bb952be 100644 --- a/internal/ceres/problem_impl.cc +++ b/internal/ceres/problem_impl.cc
@@ -249,10 +249,11 @@ // Check for duplicate parameter blocks. vector<double*> sorted_parameter_blocks(parameter_blocks); sort(sorted_parameter_blocks.begin(), sorted_parameter_blocks.end()); - vector<double*>::const_iterator duplicate_items = - unique(sorted_parameter_blocks.begin(), - sorted_parameter_blocks.end()); - if (duplicate_items != sorted_parameter_blocks.end()) { + const bool has_duplicate_items = + (std::adjacent_find(sorted_parameter_blocks.begin(), + sorted_parameter_blocks.end()) + != sorted_parameter_blocks.end()); + if has_duplicate_items { string blocks; for (int i = 0; i < parameter_blocks.size(); ++i) { blocks += StringPrintf(" %p ", parameter_blocks[i]);