Здравствуйте вот есть код, вроде написан правильно, пишу на CodeBlocks:
#include
using namespace std;
template
int main()
{
int massiv[10] = {35, 66, 98, 15, 32, 41, 24, 90, 55, 100};
std::vector
min(vec_train);
return 0;
}
Но выдает следующую ошибку:
error: conversion from 'std::vector::const_iterator {aka __gnu_cxx::__normal_iterator >}' to non-scalar type 'std::vector::iterator {aka __gnu_cxx::__normal_iterator >}' requested|
Как такие ошибки вообще расшифровывать самостоятельно, если я только недавно начал учить программирование? Спасибо.
Ответ
В функции параметр определен как константная ссылка
elemType& min (const std::vector
Поэтому такие функции, как begin и end возвращают итератор типа const_iterator. Исправьте
typename std::vector
Также вам следует включить заголовок
#include
так как в программе используется функция std::next, объявленная в этом заголовке.
Также имейте в виду, что функция min некорректна, так как в общем случае переданный вектор может быть пустым. А это значит, что в функции имеет место обращение к не существующему элементу вектора и, соответственно, разыменование недействительного итератора.
Имеется стандартный алгоритм std::min_element, объявленный в заголовке
Ваша функция может быть определена по аналогии с этим алгоритмом. Например,
#include
template
if ( select != vec.end() )
{
for ( auto it = vec.begin(), end_it = vec.end(); ++it != end_it; )
{
if ( *it < *select ) select = it;
}
}
return select;
}
int main()
{
int massiv[] = { 35, 66, 98, 15, 32, 41, 24, 90, 55, 100 };
const size_t N = sizeof( massiv ) / sizeof( *massiv );
std::vector
auto it = min( vec_train );
if ( it != vec_train.end() )
{
std::cout << "Minimum is " << *it << std::endl;
}
return 0;
}
Вывод прогоаммы на консоль
Minimum is 15
Если ваш компилятор не поддерживает спецификатор типа auto, то функцию можно определить как
template
const_iterator select = vec.begin();
if ( select != vec.end() )
{
for ( const_iterator it = vec.begin(), end_it = vec.end(); ++it != end_it; )
{
if ( *it < *select ) select = it;
}
}
return select;
}
Комментариев нет:
Отправить комментарий