c++中使用vector的泛型列表

Generic List Using Vectors in C++

本文关键字:泛型 列表 vector c++      更新时间:2023-10-16

我对编程比较陌生,我在入门课上做得很好。然而,当我们开始进入更高级的c++概念时,我变得越来越迷茫。我在实验室作业上遇到了问题,希望你们能帮忙!

写一个泛型列表类GenericList。类应该使用一个vector,并且能够使用任何类型名称创建。该类应具有以下成员:
    一个简单的构造函数
  • 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循环在抓取函数。显然,编译器将随机数放入vector

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

    BTW,对于vector,您不需要last字段。它保存在vector: ' vector.size()。但是当你可以直接使用vector时,为什么要包装vector呢?

  3. 如果你只想要最小的,priority_queue就可以了。

正如gongzhitaao所说,这一行不喜欢你,因为你从不声明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循环之后。