1

我对编程比较陌生,我在入门课上做得很好。然而,随着我们开始深入了解 C++ 的更高级概念,我越来越迷茫。实验室作业有问题,希望大家帮忙!

编写一个名为 GenericList 的通用列表类。该类应该使用向量并且能够以任何类型名称创建。该类应具有以下成员:

  • 一个简单的构造函数
  • add(item) - 将项目添加到列表中
  • grabSmallest() - 查找、返回和删除列表中的最小项

这是我到目前为止所拥有的,我相信它至少设置正确:

编辑

这是我在建议的更正之后所拥有的,不过我现在遇到了另一个问题。这是修改后的代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

template<typename T>
class GenericList
{
public:
    GenericList();
    void add(T value);
    T grabSmallest();

private:
    vector<T> listVector;
};

template<typename T>
GenericList<T>::GenericList()
{
}

template<typename T>
void GenericList<T>::add(T value)
{
    listVector.push_back(value);
}

template<typename T>
T GenericList<T>::grabSmallest()
{
    int smallest = listVector[0];
    for (int i = 0; i < listVector.size(); i++)
    {
        if (listVector[i] < smallest)
        {
        smallest = listVector[i];
        }
    }
}

int main (){
    GenericList<int> myList;
    myList.add(10);
    myList.add(5);
    myList.add(20);
    myList.add(15);

    for(int i=0;i<4;i++)
        cout << myList.grabSmallest() << " ";
}

我现在在抓取功能中的 for 循环出现问题。显然,编译器正在将随机数放入向量中。

4

2 回答 2

0
  1. 在哪里last

  2. 即使你有last

    template<typename T>
    void GenericList<T>::add(const T &value)
    {
        listVector[last++] = value; // <- should it be last++ or ++last?
    }
    

    还是您的意思是:

    template<typename T>
    void GenericList<T>::add(const T &value)
    {
        listVector.push_back(value)
    }
    

    顺便说一句,有了vector,您不需要该last字段。它保存在vector: ` vector.size()中。vector但是当你可以直接使用vector时为什么要换行呢?

  3. 如果你想要最小的,priority_queue就行。

于 2013-04-03T01:41:11.117 回答
0

正如公之涛所说,那行不喜欢你,因为你从不声明last,因此编译器不知道如何处理它。正如他们所说,您需要使用push_back来解决该问题。

但是您还需要解决另一个问题:如果它们不用int作它们的类型会发生什么?如果他们想要自定义类的“最少”成员怎么办?你需要改变这个:

vector<int> listVector;

对此

vector<T> listVector;

以便获取模板参数指定vector的自定义类型。T

因为grabSmallest我建议您使用某种类型的搜索来确定哪个元素是最小的,例如选择第一个元素,然后在之后循环查看每个后续元素是否更小。如果是,则将其作为您的值,然后循环。如果没有,请继续。最后剩下的那个是最小的。但请记住T始终用作您的类型。这种方法不需要在每次插入时对其进行排序。

由于这是家庭作业,我不想用代码给你 100% 的答案,但希望前面的段落足以让你继续前进。

编辑:想通了。试试 www.codepad.org 并通过它运行您的代码。

基本上,您的 grabSmallest() 方法中有两个错误。

  1. 应该T smallest = listVector[0]不是int。如果列表为空,您还应该有一个“守卫”,它返回默认值(或引发异常)。
  2. grabSmallest() 应该返回一个值,但你忘了。因此,您的编译器显然过于宽容,并没有将其标记为错误。放在return smallest方法的最后一行,就在for循环之后。
于 2013-04-03T01:53:20.510 回答