Функция для получения минимального значения массива в шаблоне - PullRequest
3 голосов
/ 25 марта 2020

У меня есть этот код в основном:

Array<int> array1 = Array<int>(5);
array1.coutArray();
cout << "Minimal value: " << min(array1, 5);

И мне нужна функция, чтобы получить минимальное значение массива. Я попробовал эту функцию:

template<class Array>
Array min(const Array* data, int size) {
    T result = data[0];
    for (int i = 1; i < size; i++)
        if (result > data[i])
            result = data[i];
    return result;
}

Но для каждого варианта из inte rnet у меня есть одна ошибка о типах первого аргумента. Как правильно написать эту функцию или она вызывает? Класс массива:

template <class T>
class Array {
protected:
    int size;
    T* DynamicArray;
public:
    Array() {};
    Array(size_t s) : size(s) {
        DynamicArray = new T[size];
        for (int i = 0; i < size; i++) {
            cout << "Element " << i+1 << ": ";
            cin >> DynamicArray[i];

        }
    }

    void coutArray() {
        for (int i = 0; i < size; i++) {
            cout << DynamicArray[i] << " ";
        }
    }

    ~Array() {
        delete[]DynamicArray;
    }
};

template<class Array>
Array getMin(Array* arr, int size)
{
    for (int i = 0; i < size; i++) {
        cout << arr[i];
    }
}

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Если вам нужно это для шаблона Array, лучше всего указать начало и конец для него:

template <class T>
class Array {
protected:
    int size;
    T* DynamicArray;
public:
    ....

    using value_type = T;

    const T* begin() const {
        return DynamicArray;
    }

    const T* end() const {
        return DynamicArray + size;
    }

    T* begin() {
        return DynamicArray;
    }

    T* end() {
        return DynamicArray + size;
    }
};

Тогда вы сможете использовать алгоритмы STL.

template<typename T>
T minimum(const T &tab)
{

    return *std::minimum_element(std::begin(tab), std::end(tab));
}

Обратите внимание, что ваш массив является плохой версией std::vector.

0 голосов
/ 25 марта 2020

Функция getMin должна быть либо функцией-членом класса, либо функцией-другом класса, чтобы иметь доступ к защищенным элементам данных класса.

Вот демонстрационная программа, которая показывает, как Функция может быть определена как функция-член класса. Я также внес некоторые незначительные изменения в определение класса.

#include <iostream>

template <class T>
class Array {
protected:
    size_t size;
    T* DynamicArray;
public:
    Array() : size( 0 ), DynamicArray( nullptr ) {}

    Array(size_t s) : size(s) {
        DynamicArray = new T[size];
        for ( size_t i = 0; i < size; i++) {
            std::cout << "Element " << i+1 << ": ";
            std::cin >> DynamicArray[i];

        }
    }

    void coutArray() const {
        for ( size_t i = 0; i < size; i++) {
            std::cout << DynamicArray[i] << " ";
        }
    }

    ~Array() {
        delete[]DynamicArray;
    }

    const T * getMin() const 
    {
        T *min = DynamicArray;

        for ( size_t i = 1; i < size; i++ ) 
        {
            if ( DynamicArray[i] < *min ) min = DynamicArray + i;
        }

        return min;
    }
};

int main() 
{
    Array<int> a( 5 );

    const int *min = a.getMin();

    if ( min != nullptr ) std::cout << "The minimum is equal to " << *min << '\n';

    return 0;
}

Вывод программы может выглядеть, например, следующим образом

Element 1: 2
Element 2: 3
Element 3: 1
Element 4: 4
Element 5: 5
The minimum is equal to 1

И ниже есть демонстрационная программа, когда функция определяется как не шаблонная функция друга класса.

#include <iostream>

template <class T>
class Array {
protected:
    size_t size;
    T* DynamicArray;
public:
    Array() : size( 0 ), DynamicArray( nullptr ) {}

    Array(size_t s) : size(s) {
        DynamicArray = new T[size];
        for ( size_t i = 0; i < size; i++) {
            std::cout << "Element " << i+1 << ": ";
            std::cin >> DynamicArray[i];

        }
    }

    void coutArray() const {
        for ( size_t i = 0; i < size; i++) {
            std::cout << DynamicArray[i] << " ";
        }
    }

    ~Array() {
        delete[]DynamicArray;
    }

    friend const T * getMin( const Array &a ) 
    {
        T *min = a.DynamicArray;

        for ( size_t i = 1; i < a.size; i++ ) 
        {
            if ( a.DynamicArray[i] < *min ) min = a.DynamicArray + i;
        }

        return min;
    }
};

int main() 
{
    Array<int> a( 5 );

    const int *min = getMin( a );

    if ( min != nullptr ) std::cout << "The minimum is equal to " << *min << '\n';

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...