【问题标题】:Function to get minimal value of array in template获取模板中数组最小值的函数
【发布时间】:2020-03-24 21:23:34
【问题描述】:

我在 main 中有这段代码:

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;
}

但是对于来自互联网的每个变体,我都有一个关于第一个参数类型的错误。如何正确编写此函数或它正在调用? 数组类:

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];
    }
}

【问题讨论】:

  • 你的main()是什么样的?
  • 你是认真的吗?如果我附上所有代码,你写的只是最小的部分。如果只有最小的部分,你需要更多......你能帮我吗?怎么了?
  • 试试看:Array min(const Array&amp; data, int size)
  • 我对这段代码有很多问题。你在哪里得到它?你为什么需要它? (或者认为你需要它?)
  • 请注意,如图所示,您的代码还有其他问题,但您的即时问题可以通过将函数 min 更改为采用 Array&amp;(数组引用)而不是指针来解决。

标签: c++ class templates definition member-functions


【解决方案1】:

如果您的 Array 模板需要这个,最好为其提供 begin 和 end:

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 的较差版本。

【讨论】:

  • 这并不能解决 OP 的问题,因为他们传递的是 Array 对象,而不是 T 类型的数组。
【解决方案2】:

函数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;
}

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 2022-11-12
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2011-08-16
    • 2012-03-14
    • 2017-12-13
    相关资源
    最近更新 更多