Я пишу небольшой рекурсивный алгоритм. Вот код:
#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,
от burncoins.cpp: 3: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:
В функции FI _FIter std :: min_element (_FIter, _FIter) [with _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/>
станд :: CIN’
burningcoins.cpp:(.text+0x16a): undefined reference to
burncoins.cpp :(. text + 0x16f): неопределенная ссылка наstd::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/>
станд :: CIN’
burningcoins.cpp:(.text+0x187): undefined reference to
burncoins.cpp :(. text + 0x18c): неопределенная ссылка наstd::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/>
std :: basic_istream> :: operator >> (int&)»
burningcoins.cpp:(.text+0x19b): undefined reference to
burncoins.cpp :(. text + 0x1b0): неопределенная ссылка наstd::cin' <br/>
std :: basic_istream> :: operator >> (int&)»
burningcoins.cpp:(.text+0x1b5): undefined reference to
burncoins.cpp :(. text + 0x1ec): неопределенная ссылка наstd::cin' <br/>
std :: basic_istream> :: operator >> (int&)»
burningcoins.cpp:(.text+0x1f1): undefined reference to
burncoins.cpp :(. text + 0x208): неопределенная ссылка наstd::cout' <br/>
std :: basic_ostream> :: оператор<<(Целое)»
burningcoins.cpp:(.text+0x20d): undefined reference to
/tmp/ccV3VLsK.o: в функции__static_initialization_and_destruction_0(int, int)': <br/>
станд :: ios_base :: Init :: Init ()»
burningcoins.cpp:(.text+0x261): undefined reference to
burncoins.cpp :(. text + 0x266): неопределенная ссылка наstd::ios_base::Init::~Init()' <br/>
std :: vector> :: _ M_range_check (unsigned long) const ‘:
/tmp/ccV3VLsK.o: In function
burncoins.cpp :(. text._ZNKSt6vectorIiSaIiEE14_M_range_checkEm [std :: vector> :: _ M_range_check (unsigned long) const] + 0x2d): неопределенная ссылка наstd::__throw_out_of_range(char const*)' <br/>
std :: vector> :: _ M_insert_aux (__ gnu_cxx :: __ normal_iterator>>, int const&) ‘:
/tmp/ccV3VLsK.o: In function
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/>
__cxa_rethrow»
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
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/>
std :: vector> :: _ M_check_len (unsigned long, char const *) const ‘:
/tmp/ccV3VLsK.o: In function
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/>
__gnu_cxx :: new_allocator :: deallocate (int *, unsigned long) ‘:
/tmp/ccV3VLsK.o: In function
burncoins.cpp :(. text._ZN9__gnu_cxx13new_allocatorIiE10deallocateEPim [__ gnu_cxx :: new_allocator :: deallocate (int *, unsigned long)] + 0x1c): неопределенная ссылка наoperator delete(void*)' <br/>
__gnu_cxx :: new_allocator :: allocate (unsigned long, void const *) ‘:
/tmp/ccV3VLsK.o: In function
burncoins.cpp :(. text._ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv [__ gnu_cxx :: new_allocator :: allocate (unsigned long, void const *)] + 0x35): неопределенная ссылка наstd::__throw_bad_alloc()' <br/>
оператор new (без знака long) ‘
burningcoins.cpp:(.text._ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv[__gnu_cxx::new_allocator<int>::allocate(unsigned long, void const*)]+0x45): undefined reference to
/tmp/ccV3VLsK.o:(.eh_frame+0x12): неопределенная ссылка на__gxx_personality_v0' <br/>
__gxx_personality_v0′
/tmp/ccV3VLsK.o:(.eh_frame+0x4f): undefined reference to
collect2: ld вернул 1 статус выхода
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);
Других решений пока нет …