[英]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循环问题。 显然,编译器正在将随机数放入向量中。
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) }
顺便说一句,使用vector
,您不需要last
字段。 它保存在vector
:` vector.size()
。 但是当直接使用vector时为什么要包装vector
呢?
如果您只想要最小的, priority_queue
会做。
正如龚致道所说,这行并不喜欢您,因为您永远不会声明last
,因此编译器不知道该怎么做。 正如他们所说,您需要使用push_back
来解决该问题。
但是您还需要解决另一个问题:如果他们不使用int
作为类型,会发生什么? 如果他们想要自定义类的“最少”成员怎么办? 您需要更改此:
vector<int> listVector;
对此
vector<T> listVector;
这样, vector
选择模板参数T
指定的自定义类型。
对于grabSmallest
我建议您使用某种类型的搜索来确定哪个元素最小,例如选择第一个元素,然后在其后循环遍历,以查看随后的每个元素是否较小。 如果是,则将其作为您的值并循环。 如果没有,那就继续吧。 最后剩下的那个最小。 但是请记住,始终使用T
作为您的类型。 使用此方法无需在每个插入上对它进行排序。
因为这是家庭作业,所以我不想给您100%的代码答案,但是希望上一段足以使您继续前进。
编辑:想通了。 尝试www.codepad.org并通过它运行代码。
基本上,您的handleSmallest()方法中有两个错误。
T smallest = listVector[0]
而不是int
。 如果列表为空,则还应该有一个“防护”,该防护返回默认值(或引发异常)。 return smallest
的return smallest
作为方法的最后一行,放在for
循环之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.