Инициализировать размер вектораи доступ - PullRequest
0 голосов
/ 13 февраля 2012

Эй, я немного запутался в том, как конструктор инициализирует размер вектора>.Это мой 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);

если нет, как мне это сделать?

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2012

Чтобы установить начальный размер, вы можете использовать список инициаторов,

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

или вызвав метод изменения размера внутри:

theList.resize(size);
0 голосов
/ 13 февраля 2012

Для вашего первого вопроса код правильный.Это создаст вектор с size элементами, эти элементы будут созданы по умолчанию, что в этом случае означает, что они являются пустыми списками.НО вы должны поместить эту инициализацию в список инициализации следующим образом (вы также должны сделать это для других членов).

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

Это запретит конструктору сначала вызывать конструктор по умолчанию вашего объекта theList (так что это действительный объект).

Ответ на другие ваши вопросы - да, но если вы используете C ++ 11, вы, вероятно, можете сохранить некоторые утомительные циклы for, используя for_each и лямбда , например, вот так:

std::for_each(theList.begin(),theList.end(),[&data](std::list& l) { l.push_back(data)});
0 голосов
/ 13 февраля 2012

Поздравляем, вы обнаружили разницу между инициализацией и назначением .

Назначение происходит при попытке установить существующий объект на новое значение; инициализация - это когда объект создается и вызывается его конструктор.

То, что вы делаете в своем конструкторе (что по какой-то причине не отображается в вашем заголовке, что делает ваш код более запутанным, чем должно быть), является присваиванием. К моменту выполнения тела конструктора все элементы уже инициализированы.

Чтобы инициализировать члена, используйте синтаксис списка инициализатора:

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

Это вызовет конструктор для каждого из указанных элементов с указанными аргументами.

...