使用C ++中的向量的通用列表

时间:2013-04-03 01:39:16

标签: c++ templates vector typename

我对编程比较陌生,而且在我的入门课程中表现得非常好。然而,随着我们开始涉及更高级的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循环问题。显然,编译器会将随机数放入向量中。

2 个答案:

答案 0 :(得分:0)

  1. last

  2. 在哪里?
  3. 即使您拥有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

  4. 如果你想要最小的,priority_queue会做。

答案 1 :(得分:0)

正如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。如果列表为空,您还应该有一个“guard”返回默认值(或抛出异常)。
  2. grabSmallest()应该返回一个值,但是你忘记了。因此,您的编译器显然太宽容了,并没有将其标记为错误。将return smallest作为方法的最后一行,就在for循环之后。