Не удается заставить min_element работать в C ++

0

Я пишу небольшой рекурсивный алгоритм. Вот код:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> coins;

int checkchange(int left) {
    vector<int> choices (coins.size());
    if (left == 0)
        return 0;
    else {
        int min;
        for (int i=0;i<coins.size();i++) {
            choices.at(i) = (1 + checkchange(left - coins.at(i)));
        }
        return min_element(choices.front(),choices.back());
    }
}


int main() {
    int N;
    cin >> N;
    for (int i=0;i<N;i++) {
        int c,m,temp,change;
        cin >> c >> m;
        for (int j=0;j<c;j++) {
            cin >> temp;
            coins.push_back(temp);
        }

        for (int j=0;j<m;j++) {
            cin >> temp;
            change = checkchange(temp);
            cout << change;
        }
    }
    return 0;
}

Я получаю следующую ошибку:

В файле, включенном в
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/algorithm:62,
from burningcoins.cpp: 3: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo. час:
В функции '_FIter std :: min_element (_FIter, _FIter) [с _FIter =
int]: burncoins.cpp: 19: созданный здесь
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:5998:
Ошибка: неверный аргумент типа 'унарный *
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:5998:
Ошибка: неверный аргумент типа 'унарный *

Я попытался скомпилировать как с g++, так и с gcc, обе дают мне ту же ошибку. Что я делаю не так?

Редактировать:

Новый код:

int checkchange(int left) {
    vector<int> choices (coins.size());
    if (left == 0)
        return 0;
    else {
        for (int i=0;i<coins.size();i++) {
            choices[i] = (1 + checkchange(left - coins.at(i)));
        }
        return *min_element(choices.begin(), choices.end());
    }
}

Новое сообщение об ошибке:

/tmp/ccV3VLsK.o: В функции main': <br/> burningcoins.cpp:(.text+0x16a): undefined reference to std :: cin'
burncoins.cpp :( текст + 0x16f): неопределенная ссылка на std::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/> burningcoins.cpp:(.text+0x187): undefined reference to std :: cin '
burncoins.cpp :( текст + 0x18c): неопределенная ссылка на std::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/> burningcoins.cpp:(.text+0x19b): undefined reference to std :: basic_istream> :: operator >> (int &) '
burncoins.cpp :( text + 0x1b0): неопределенная ссылка на std::cin' <br/> burningcoins.cpp:(.text+0x1b5): undefined reference to std :: basic_istream> :: operator >> (int &) '
burncoins.cpp :( текст + 0x1ec): неопределенная ссылка на std::cin' <br/> burningcoins.cpp:(.text+0x1f1): undefined reference to std :: basic_istream> :: operator >> (int &) '
burncoins.cpp :( текст + 0x208): неопределенная ссылка на std::cout' <br/> burningcoins.cpp:(.text+0x20d): undefined reference to std :: basic_ostream> :: operator << (int) '
/tmp/ccV3VLsK.o: В функции __static_initialization_and_destruction_0(int, int)': <br/> burningcoins.cpp:(.text+0x261): undefined reference to std :: ios_base :: Init :: Init()'
burncoins.cpp :( текст + 0x266): неопределенная ссылка на std::ios_base::Init::~Init()' <br/>/tmp/ccV3VLsK.o: In function std :: vector> :: _ M_range_check ( unsigned long) const ':
burncoins.cpp :( text._ZNKSt6vectorIiSaIiEE14_M_range_checkEm [std :: vector> :: _ M_range_check (unsigned long) const] +0x2d): неопределенная ссылка на std::__throw_out_of_range(char const*)' <br/>/tmp/ccV3VLsK.o: In function std :: vector> :: _ M_insert_aux (__ gnu_cxx :: __ normal_iterator>>, int const &) ':
burncoins.cpp :( text._ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi [std :: vector> :: _ M_insert_aux (__ gnu_cxx :: __ normal_iterator>>, int const &)] +0x259): неопределенная ссылка на __cxa_begin_catch' <br/> burningcoins.cpp:(.text._ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi[std::vector<int, std::allocator<int> >::_M_insert_aux(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int const&)]+0x2be): undefined reference to __cxa_rethrow '
burncoins.cpp :( text._ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi [std :: vector> :: _ M_insert_aux (__ gnu_cxx :: __ normal_iterator>>, int const &)] +0x2c8): неопределенная ссылка на __cxa_end_catch' <br/>/tmp/ccV3VLsK.o: In function std :: vector> :: _ M_check_len (unsigned long, char const *) const ':
burncoins.cpp :( text._ZNKSt6vectorIiSaIiEE12_M_check_lenEmPKc [std :: vector> :: _ M_check_len (unsigned long, char const *) const] +0x4c): неопределенная ссылка на std::__throw_length_error(char const*)' <br/>/tmp/ccV3VLsK.o: In function __gnu_cxx :: new_allocator :: deallocate (int *, unsigned long) ':
burncoins.cpp :( text._ZN9__gnu_cxx13new_allocatorIiE10deallocateEPim [__ gnu_cxx :: new_allocator :: deallocate (int *, unsigned long)] +0x1c): неопределенная ссылка на operator delete(void*)' <br/>/tmp/ccV3VLsK.o: In function __gnu_cxx :: new_allocator :: allocate (unsigned long, void const *) ':
burncoins.cpp :( text._ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv [__ gnu_cxx :: new_allocator :: allocate (unsigned long, void const *)] +0x35): undefined ссылка на std::__throw_bad_alloc()' <br/> burningcoins.cpp:(.text._ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv[__gnu_cxx::new_allocator<int>::allocate(unsigned long, void const*)]+0x45): undefined reference to оператор new (unsigned long) '
/tmp/ccV3VLsK.o:(.eh_frame+0x12): неопределенная ссылка на __gxx_personality_v0' <br/>/tmp/ccV3VLsK.o:(.eh_frame+0x4f): undefined reference to __gxx_personality_v0'
collect2: ld возвращен 1 статус выхода

Теги:
min
redhat
minimum

1 ответ

4
Лучший ответ

std::min_element принимает диапазон. front и back обратные ссылки на фактические значения. Вы должны использовать методы begin и end для возврата итератора в соответствующие позиции в векторе:

min_element(choices.begin(), choices.end());
//                  ^^^^^            ^^^

Если вы считаете это утомительным, вы можете создать функцию, которая обертывается вокруг стандартного min_element:

template <class Container>
auto min_element(Container c) -> decltype(std::min_element(c.begin(), c.end()))
{
    return std::min_element(c.begin(), c.end());
}

И используйте его как:

min_element(choices);
  • 0
    Я изменил его на то, что вы сказали, и получил следующую ошибку: burncoins.cpp: в функции 'int checkchange (int)': burncoins.cpp: 19: ошибка: не могу преобразовать '__gnu_cxx :: __ normal_iterator <int *, std: : vector <int, std :: allocator <int>>> в 'int' взамен я представляю, что это потому, что он возвращает указатель. Но разыменование со звездным оператором дает мне еще больше ошибок?
  • 0
    @BananaCode Это единственное изменение, которое вы сделали?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню