向量中的最大值

时间:2019-06-19 15:11:28

标签: c++

我正在尝试计算int []中的最大值。下面的程序崩溃了,但我不明白为什么。 Test类是否存在问题?谢谢。

class Max {
    int *max;
public:
    Max() {
        max = NULL;
    }
    ~Max() {
        if (max)
            delete max;
    }
    void compute(int N[], int n) {
        this->~Max();
        max = new int(N[0]);
        for (int i = 0; i < n; i++)
            if (*max < N[i])
                *max = N[i];
    }
    void print() {
        cout << "Max= " << *max << endl;
    }
};

class Test {
public:
    static Max& getMax(int N[], int n) {
        Max m;
        m.compute(N, n);
        return m;
    }
};


void main() {
    int N[] = { 8,9,7,8,10,6 };
    Test::getMax(N, sizeof(N) / sizeof(int)).print();
}

3 个答案:

答案 0 :(得分:2)

最好的方法是将std::vector / std::arraystd::max_element一起使用。我建议先学习具有stl容器和算法的现代c ++,然后再学习低级功能。

但是您可以从这里学习代码中的错误:

  1. 使用nullptr代替NULL

    Max() {
        max = nullptr;
    }
    
  2. 不要调用析构函数

    this->~Max();
    
  3. 不返回对局部变量的引用

    static Max& getMax(int N[], int n) { // 
        Max m;
        m.compute(N, n);
        return m;
    }
    
  4. 请勿使用using namespace std;

  5. 请记住为每个delete调用new,为每个delete[]调用new []。 (如果可能,请避免使用newnew []deletedelete[]

  6. 您不需要max的指针。在您稍加使用代码后,int max;也可以使用。

答案 1 :(得分:1)

您当然可以使用Import-Module "C:\Program Files\Microsoft Azure AD Sync\Bin\ADSync\ADSync.psd1"std::vector,但是代码的真正问题(除了许多错误)是令人费解的。用C ++进行编程比编写要容易。

这里是直接编写相同代码的方法,此简单任务不需要任何类。

std::max_element

未经测试的代码。

答案 2 :(得分:0)

  

向量中的最大值

那不是向量。这是一个数组。整数向量称为std::vector<int>。您可能应该使用一个。

void compute(int N[], int n) {
    this->~Max();

此行之后,被称为*this的对象正式是 dead 。除了取消分配内存或使用new位置在其尸体上构造另一个实例外,您不能对其进行任何合法操作。

实际上所做的事-既不做任何事情-都是非法的和不道德的。

据我所知,在这里有一个指针(并重新/取消/分配它)甚至什么都没有实现。如果您只能编写int max;并避免动态分配,则可以这样做。

static Max& getMax(int N[], int n) {
    Max m;
    m.compute(N, n);
    return m;
}

返回对临时目录的引用也是非法的。要么

  • 按值返回m(如果要使动态分配正常工作,则需要编写适当的复制并移动构造函数和赋值运算符,尽管仅删除它会节省很多工作和错误)< / li>
  • 或者只返回计算出的最大值并在外面打印(没有明显的理由应该将Max类耦合到std::cout)。

总而言之,我的推荐顺序是:

  1. 使用std::vector<int>std::max_element
  2. 如果您必须编写自己的版本,max仍应是返回结果的函数,而不是将对象变异为...以存储结果的方法为以后?所以:

    int compute_max(int const *n, int nlen) {
        // handle corner cases
        if (nlen < 1) return std::numeric_limits<int>::min();
    
        int result = n[0];
        for (int i = 1; i < nlen; i++)
            if (result < n[i])
                result = n[i];
        return result;
    }
    
  3. 如果您必须有一个有状态的Max类(对我来说这仍然是很奇怪的设计),只需删除动态分配

  4. 如果必须具有动态分配,则仍然需要停止显式调用析构函数,将需要实现复制并移动构造函数/赋值运算符,并且理想情况下应使用std::unique_ptr<int>原始指针的

无论您喜欢哪种Max的实现方式(并且我想强调的是,选项3&4是距离很远的第三和第四最佳选项,仅在非常罕见或人为的条件下使用),您必须 不返回对getMax()中的局部变量的引用。显然,还是在其他任何地方。