初始化矢量<列表<DATA>>和访问的大小

Initialize size of vector<list<DATA> > and accesses

本文关键字:gt lt 访问 列表 初始化 DATA      更新时间:2023-10-16

嘿,我对构造函数如何初始化向量的大小有点困惑>。这是我的hpp

#include <vector>
#include <list>
#include <ostream>
using namespace std ; 
typedef struct { double successful[2] , unsuccessful[2] ; } Perform ;

template <class DATA>
class Table {
private :
    vector<list<DATA> > theList;
    typename list<DATA>::iterator itr;
    unsigned listSize;
    unsigned actualSize;
    unsigned probe;
...

在我的cpp 中

template <class DATA> Table<DATA>::Table(unsigned int size)
{
    listSize = size;
    actualSize = 0;
    probe = 0;
    theList(size); //Not sure how to make the vector of size "size"
}

如果我想清除每个矢量位置的列表,我可以做一个for循环,让代码是吗

theList[i].clear();

还是我必须做一些不同的事情?

最后一个问题是在矢量旁边的每个列表中插入一些东西,我能做吗

theList[i].push_back(data);

如果没有,我该怎么做?

谢谢你的帮助。

祝贺您,您发现了初始化分配之间的区别。

当您尝试将现有对象设置为新值时,会发生赋值;初始化是指创建一个对象并调用其构造函数。

您在构造函数中所做的事情(由于某种原因,它没有显示在您的头中,这使您的代码变得更加混乱)是赋值。到构造函数主体执行时,所有成员都已初始化。

初始化成员,请使用初始化器列表语法:

template <class DATA> Table<DATA>::Table(unsigned int size)
  : listSize(size), actualSize(0), probe(0), theList(size)
{
}

这将使用指定的参数为每个指定元素调用构造函数。

要设置初始大小,可以使用initialer list,

template <class DATA> Table<DATA>::Table(unsigned int size)
 : theList(size) 
{
...

或者通过调用内部的resize方法:

theList.resize(size);

对于您的第一个问题,代码是正确的。这将创建一个带有size元素的向量,这些元素将是默认构造的,在这种情况下,这意味着它们是空列表。但是您应该将此初始化放置在初始化列表中,如下所示(您也应该为其他成员btw执行此操作)。

template <class DATA> Table<DATA>::Table(unsigned int size) : theList(size)
{
    ...
}

这将禁止构造函数首先调用theList对象的默认构造函数(因此它是一个有效的对象)。

其他问题的答案是肯定的,但如果你使用C++11,你可能可以通过使用for_each和lambdas来节省一些繁琐的循环,例如:

std::for_each(theList.begin(),theList.end(),[&data](std::list& l) { l.push_back(data)});