C++ C++;模板类

C++ C++;模板类,c++,class,templates,function,C++,Class,Templates,Function,嘿。。 我在做一些家庭作业方面遇到了困难 我们正在研究VectorList(有点像链表,但有向量-不要问为什么…) 不管怎样,我有这样的想法: #ifndef VECTORLIST_H #define VECTORLIST_H #include <iostream> #include <vector> using namespace std; template< typename NODETYPE > class VectorList { publ

嘿。。 我在做一些家庭作业方面遇到了困难

我们正在研究VectorList(有点像链表,但有向量-不要问为什么…) 不管怎样,我有这样的想法:

#ifndef VECTORLIST_H 
#define VECTORLIST_H

#include <iostream>
#include <vector>

using namespace std;

template< typename NODETYPE >

class VectorList 
{
public:
  VectorList(); // constructor
  ~VectorList(); // destructor

  void insertAtFront( const NODETYPE & );
  void insertAtBack( const NODETYPE & );
  bool removeFromFront( NODETYPE & );
  bool removeFromBack( NODETYPE & );
  bool isEmpty() const;
  void print() const;

private:
  vector< NODETYPE > *vList;  // list data as a vector

};
\ifndef矢量列表
#定义向量列表
#包括
#包括
使用名称空间std;
模板
类向量表
{
公众:
VectorList();//构造函数
~VectorList();//析构函数
void insertafront(const NODETYPE&);
void insertback(const节点类型&);
从前面移除布尔(节点类型&);
bool-removeFromBack(NODETYPE&);
bool isEmpty()常量;
无效打印()常量;
私人:
vector*vList;//将数据列为向量
};
我需要填写函数。。我的问题是我不明白怎么做 当我有*列表时使用STIL。。它是指向第一个向量元素的指针

// display contents of VectorList
template< typename NODETYPE >
void VectorList< NODETYPE >::print() const
{
  // Fill in the missing code 
} 
//显示矢量列表的内容
模板
void VectorList::print()常量
{
//填写缺少的代码
} 

我的想法是在向量上使用for循环并使用
cout你应该在构造函数中构造你的对象(如果你真的需要使用裸指针):
vList=newvector(),析构函数中的可用内存:
删除vList,将您的方法转换为容器类的相应方法。例如,
insertback
将实现为
vList->push_-back(elem)

我的问题是,我不明白当我 我有一份清单。。它是指向第一个向量元素的指针

// display contents of VectorList
template< typename NODETYPE >
void VectorList< NODETYPE >::print() const
{
  // Fill in the missing code 
} 
我假设你的家庭作业要求你使用指向向量的指针,而不是向量本身。通常,我从不使用指向容器的指针。事实上,我发现在从C切换到C++中,最好的是,由于STL编程,我可以不用指针来编写整个程序。除非您需要使用指向向量的指针,否则我建议您直接使用向量

当然,使用向量比使用指针更容易,但不要担心。使用指针还不错

首先,为了使用指向某物的指针,必须分配某物。因此,在构造函数中,调用
new

vList = new std::vector<NODETYPE>;
你说:

但由于vList是一个指针。。它不太好用

这里是生活变得轻松的地方。通常,如果
p
是指向某个类型的指针,则
(*p)
p
指向的对象。以下是一些例子:

int i = 1;
int *pInt = &i;

i = 4;
(*pInt) = 4;
std::cout << i << " " << (*pInt) << "\n";

std::vector<NODETYPE> v;
std::vector<NODETYPE> *pVector;

v.push_back();
(*pVector).push_back();

it = v.begin();
it = (*pVector).end();
有一个快捷运算符
->
,使上述内容更易于阅读:

void insertAtFront(const NODETYPE& node) { vList->push_front(node); }
表达式
x->y
或多或少相当于
(*x).y

总而言之:

使用
new
在构造函数中分配
vList
。使用
delete
销毁析构函数中的
vList
。使用
(*vList).function()或
vList->function()调用vList的成员

祝你好运,如果你还有其他问题,请回来

P.S.因为你有一个非平凡的析构函数,你需要考虑.< /P>


p.p.s.您说过在析构函数中迭代向量并删除在那里找到的每个对象。如果您的数据类型是指向节点类型的指针向量(与您声明的相反:指向节点类型向量的指针),则只需要这样做。除非您完全熟悉指针,否则我建议您不要将指针存储在STL容器中

添加了
家庭作业
标记,但删除了
打印
标记,因为系统只允许5个标记。切勿在头文件中使用
名称空间
声明,这将迫使
std
名称空间进入所有用户,这可能会导致代码中的名称冲突。几乎所有的问题都来自于试图使用指向向量的指针。如果你把向量直接存储在你的类中,那么大多数其他的东西都能正常工作@纳瓦兹:别给我-1,给OP的教授。我只是在演示如何做他显然被指派去做的事情。你们至少应该告诉他,当不需要的时候,使用指向向量的指针是个坏主意。如果你这样做,我就投赞成票!我以为我有,但现在我看到警告很弱。我加强了帖子中的警告。对于OP:我从不使用指向容器的指针,也从不使用指针容器。我建议你也不要这样做,除非你明白原因。正如你所看到的,我提到这一点只是因为在家庭作业中有这样的规定。我也不会做这样的事。
void insertAtFront(const NODETYPE& node) { vList->push_front(node); }