Ваша функция шаблона is_sorted()
не проверяет должным образом, равен ли first
значение last
перед увеличением next
, которое является копией first
:
template <class Iter> bool is_sorted(Iter first, Iter last)
{
Iter next = first; // next element
for (next++; next != last; next++, first++) {
if (*first > *next)
return false;
}
return true;
}
Это может привести к проблемам, если вы перебираете пустой диапазон, я думаю.
template <class Iter> bool is_sorted(Iter first, Iter last)
{
if (first == last)
return false;
for (Iter next = first+1; next != last; next++, first++)
{
if (*first > *next)
return false;
}
return true;
}
Я не уверен, что вы получаете пустые диапазоны ... так что это может быть красная сельдь.
Поскольку вы не устанавливаете список перед проверкой его сортировки (и не проверяете, сортируется ли он после вставки данных), вы сталкиваетесь с проблемами с пустыми диапазонами. Вам необходимо изменить последовательность операций вставки и проверки:
vector<double> data = gen_data(num_elts);
time_insert(insert_list, data);
check_sort(l.begin(), l.end(), "list");
time_insert(insert_set, data);
check_sort(s.begin(), s.end(), "set");
time_insert(insert_vector, data);
check_sort(v.begin(), v.end(), "vector");
Вы должны избегать дублирования кода в вашем основном цикле, вызывая функцию, чтобы получить количество элементов для обработки. Также обычно сообщают об ошибках на cerr
.
static int get_num_elts()
{
int num_elts;
cout << "How many elements for container? ";
cin >> num_elts;
if (num_elts < 1)
cerr << "Error: number should be >= 1" << endl;
return num_elts;
}
...
int num_elts;
while ((num_elts = get_num_elts()) > 0)
{
vector<double> data = gen_data(num_elts);
time_insert(insert_list, data);
check_sort(l.begin(), l.end(), "list");
time_insert(insert_set, data);
check_sort(s.begin(), s.end(), "set");
time_insert(insert_vector, data);
check_sort(v.begin(), v.end(), "vector");
}