diff --git a/src/nnet3/nnet-common.cc b/src/nnet3/nnet-common.cc index 31ff9819dfa..e4bd1a402eb 100644 --- a/src/nnet3/nnet-common.cc +++ b/src/nnet3/nnet-common.cc @@ -392,11 +392,12 @@ size_t IndexVectorHasher::operator () ( // skipping over more elements. Setting n1 large or // n2 to 1 would make the hasher consider all // elements. + size_t len = index_vector.size(); // all long-ish numbers appearing below are randomly chosen primes. - size_t ans = 1433 + 34949 * index_vector.size(); + size_t ans = 1433 + 34949 * len; std::vector::const_iterator iter = index_vector.begin(), end = index_vector.end(), med = end; - if (med > iter + n1) + if (n1 < len) med = iter + n1; for (; iter != med; ++iter) { @@ -412,6 +413,10 @@ size_t IndexVectorHasher::operator () ( ans += iter->n * 1619; ans += iter->t * 15649; ans += iter->x * 89809; + // The following if-statement was introduced in order to fix an + // out-of-range iterator problem on Windows. + if (n2 > len || iter >= end - n2) + break; } return ans; }