我对编程比较陌生,而且在我的入门课程中表现得非常好。然而,随着我们开始涉及更高级的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循环问题。显然,编译器会将随机数放入向量中。
答案 0 :(得分:0)
last
?
即使您拥有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
?
如果你想要最小的,priority_queue
会做。
答案 1 :(得分:0)
正如gongzhitaao所说,那条线不喜欢你,因为你从未声明last
,因此编译器不知道如何处理它。正如他们所说,你需要使用push_back
来解决这个问题。
但是你还需要解决另一个问题:如果他们不使用int
作为他们的类型会发生什么?如果他们想要自定义类的“最少”成员怎么办?你需要改变这个:
vector<int> listVector;
到这个
vector<T> listVector;
以便vector
选择模板参数T
指定的自定义类型。
对于grabSmallest
我建议您使用某种类型的搜索来确定哪个元素最小,例如选择第一个元素,然后在此之后循环以查看每个元素是否更小。如果是,请将其作为您的值,然后循环。如果没有,继续前进。最后遗留的是最小的。但请记住始终使用T
作为您的类型。使用此方法不需要在每个插入上对其进行排序。
由于这是家庭作业,我不想用代码给你100%的答案,但希望前面的段落足以让你顺利。
编辑:想通了。试试www.codepad.org并通过它运行你的代码。
基本上,你的grabSmallest()方法中有两个错误。
T smallest = listVector[0]
而不是int
。如果列表为空,您还应该有一个“guard”返回默认值(或抛出异常)。return smallest
作为方法的最后一行,就在for
循环之后。