c++中使用vector的泛型列表
Generic List Using Vectors in C++
我对编程比较陌生,我在入门课上做得很好。然而,当我们开始进入更高级的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
-
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时,为什么要包装vector
呢? -
如果你只想要最小的,
priority_queue
就可以了。
正如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
。如果列表为空,你还应该有一个"保护",返回一个默认值(或抛出一个异常)。 - grabSmallest()应该返回一个值,但是您忘记了。所以你的编译器显然太宽容了,没有把它标记为错误。将
return smallest
作为方法的最后一行,就在for
循环之后。
- 错误处理.将系统错误代码映射到泛型
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何编写将要继承的泛型代码?
- C++17 如何保存泛型可调用对象以供以后使用
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- 具有泛型列表参数和委托的函数
- 在 stl 映射和列表 (c++) 上进行迭代的泛型循环
- 如何在泛型列表之上构建通用堆栈?C++
- 接受泛型列表类型对象的参数
- 泛型列表节点类中出错
- 狗是动物,但列表<Dog>不是列表<Animal>。如何在泛型/多态函数中安全地使用它?
- 具有泛型类方法定义的长模板参数列表
- c++中使用vector的泛型列表
- 如何在动态内存中排序对象列表,在c++中使用泛型向量