繁体   English   中英

在C ++中使用向量的泛型列表

[英]Generic List Using Vectors in C++

我是编程新手,在入门班上确实表现出色。 但是,随着我们开始进入C ++的更高级概念,我越来越迷路了。 我的实验室作业有问题,希望大家能帮忙!

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

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

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

编辑

这是在提出了建议的更正之后的结果,但是现在我遇到了一个不同的问题。 这是修改后的代码:

#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循环问题。 显然,编译器正在将随机数放入向量中。

  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会做。

正如龚致道所说,这行并不喜欢您,因为您永远不会声明last ,因此编译器不知道该怎么做。 正如他们所说,您需要使用push_back来解决该问题。

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

vector<int> listVector;

对此

vector<T> listVector;

这样, vector选择模板参数T指定的自定义类型。

对于grabSmallest我建议您使用某种类型的搜索来确定哪个元素最小,例如选择第一个元素,然后在其后循环遍历,以查看随后的每个元素是否较小。 如果是,则将其作为您的值并循环。 如果没有,那就继续吧。 最后剩下的那个最小。 但是请记住,始终使用T作为您的类型。 使用此方法无需在每个插入上对它进行排序。

因为这是家庭作业,所以我不想给您100%的代码答案,但是希望上一段足以使您继续前进。

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

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

  1. 它应该是T smallest = listVector[0]而不是int 如果列表为空,则还应该有一个“防护”,该防护返回默认值(或引发异常)。
  2. captureSmallest()应该返回一个值,但是您忘记了。 因此,您的编译器显然太宽容了,并且没有将其标记为错误。 return smallestreturn smallest作为方法的最后一行,放在for循环之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM