Do not dereference an iterator when it point to the end. Thanks to Markus Moll for catching my broken fix from a previous change. Change-Id: I37d0185cfc6f86d0c31f580ca988577abc168ab5
diff --git a/internal/ceres/suitesparse.cc b/internal/ceres/suitesparse.cc index 96c1d6c..cf3c48f 100644 --- a/internal/ceres/suitesparse.cc +++ b/internal/ceres/suitesparse.cc
@@ -224,9 +224,16 @@ vector<int>::const_iterator it = lower_bound(row_block_starts.begin(), row_block_starts.end(), scalar_rows[idx]); - - // Only consider the first row of each row block. - if (*it != scalar_rows[idx]) { + // Since we are using lower_bound, it will return the row id + // where the row block starts. For everything but the first row + // of the block, where these values will be the same, we can + // skip, as we only need the first row to detect the presence of + // the block. + // + // For rows all but the first row in the last row block, + // lower_bound will return row_block_starts.end(), but those can + // be skipped like the rows in other row blocks too. + if (it == row_block_starts.end() || *it != scalar_rows[idx]) { continue; }