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からインクルードされたファイルで
、burningcoins.cpp から: 3: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:
関数内 '_FIter std ::min_element(_FIter, _FIter) [with _FIter =
int]': burningcoins.cpp:19: ここからインスタンス化
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../.. /../include/c++/4.4.7/bits/stl_algo.h:5998:
エラー: 'unary *' の型引数が無効です
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../ ../../../include/c++/4.4.7/bits/stl_algo.h:5998:
エラー: 'unary *' の型引数が無効です

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 tostd::cin'
Burningcoins.cpp:(.text+0x16f): std::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/> burningcoins.cpp:(.text+0x187): undefined reference tostd::cin への未定義の参照' Burningcoins.cpp:(.text+0x18c): std::
への未定義の参照:: std::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/> burningcoins.cpp:(.text+0x19b): undefined reference tobasic_istream >::operator>>(int&)'
burningcoins.cpp:(.text+0x1b0): std::cin' <br/> burningcoins.cpp:(.text+0x1b5): undefined reference tostd::basic_istream への未定義参照 >::operator>>(int&)'
Burningcoins.cpp:(.text+0x1ec): std::basic_istreamへの未定義の参照std::cin' <br/> burningcoins.cpp:(.text+0x1f1): undefined reference to>::operator>>(int&)'
burningcoins.cpp:(.text+0x208): std::cout' <br/> burningcoins.cpp:(.text+0x20d): undefined reference tostd::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()'
burningcoins.cpp:(.text+0x266):への未定義の参照std::ios_base::Init::~Init()' <br/> /tmp/ccV3VLsK.o: In functionstd::vector >::_M_range_check(unsigned long) const':
burningcoins.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 functionstd::vectorへの未定義の参照>::_M_insert_aux(__gnu_cxx::__normal_iterator > >, int const&)':
burningcoins.cpp:(.text._ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi[std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >)+ int20 const20]+ : __cxa_rethrow への未定義__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の参照
Burningcoins.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 functionstd::vector >::_M_check_len(unsigned long, char const*) const':
burningcoins.cpp:(.text._ZNKSt6vectorIiSaIiEE12_M_check_lenEmPKc[std::vector >::_M_check_len(unsigned long, char const*) const]+0x4c) : __gnu_cxx::new_allocator::deallocate(int*, unsigned long) への未定義参照std::__throw_length_error(char const*)' <br/> /tmp/ccV3VLsK.o: In function':
burningcoins.cpp:(.text._ZN9__gnu_cxx13new_allocatorIiE10deallocateEPim[__gnu_cxx::new_allocator::deallocate(int*, unsigned long)]+0x1c): 未定義__gnu_cxx operator delete(void*)' <br/> /tmp/ccV3VLsK.o: In function::new_allocator::allocate(unsigned long, void const*) への参照':
burningcoins.cpp:(.text._ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv[__gnu_cxx::new_allocator::allocate(unsigned long, void const*)]+0x35): 未定義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 への未定義の参照__gxx_personality_v0' <br/> /tmp/ccV3VLsK.o:(.eh_frame+0x4f): undefined reference to'
collect2: ld が 1 つの終了ステータスを返しました

4

1 に答える 1

4

std::min_element範囲を取ります。実際の値への参照を返しますfront。ベクトル内の対応する位置に反復子を返すには、 メソッドとメソッドをback使用する必要があります。beginend

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);
于 2013-10-17T20:13:44.697 に答える