2013-05-15 1 views
2

Я пытаюсь инициировать 3d-вектор в C++. Я хочу, чтобы это изначально было 100 на 100 на 1, но у меня проблемы. (Я знаю, что это 2d в основном, но я буду изменять размер вектора оси z позже.)Инициализация 3d-векторов C++

У меня есть класс Entity, который должен содержать указатель на. Я правильно включил заголовки Entity, но он все еще не работает. Вот что я пытаюсь сделать:

vector <vector <vector <Entity* > > > matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL))); 

Ошибка компилятора - это «ожидаемый идентификатор перед численной константой». Я проверил внимательно, и нет недостающих точек с запятой или чего-то еще до этой строки. Если я удалю эту строку, код будет компилироваться чисто.

Это непосредственно после строки «private:» в определении функции. Могут ли переменные-члены принимать конструкторы? Я также попытался поставить только

vector <vector <vector <Entity* > > > matrix; 

в файле .h и

matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL))); 

в конструкторе в файле .cpp, но не работал ни (не подходит для вызова, а также недействительным преобразование INT в Entity *)

Какой самый лучший способ объявить 3d «вектор» этого (особенно в классе?)

Спасибо!

+0

Поймите, что вы получите ужасную локальность данных из-за отдельных распределений. Если производительность становится проблемой, рассмотрите один большой вектор и вручную вычислите смещения. Кроме того, предпочитайте 'std :: unique_ptr' или' std :: shared_ptr' для сырых указателей, если вектор «владеет» каждым элементом. –

+0

Есть ли проблемы с памятью с использованием 2d массива векторов? – Nathan

+0

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

ответ

2

Необходимо инициализировать его в своем конструкторе классов.

class MyClass 
{ 
public: 
    MyClass() 
     : matrix (100, vector < vector < Entity* > > (100,vector<Entity*> (1, NULL))) 
    {} 

private: 
    vector <vector <vector <Entity* > > > matrix; 
}; 

Лично я бы не использовать векторы-из-векторов для матриц, так как я уже обсуждал в следующем сообщении:

Get the first column of a matrix represented by a vector of vectors

Я бы порекомендовал вам принять подход, аналогичный что, но адаптировано для 3D-матрицы. По существу, вы обрабатываете первые два измерения как прямоугольник (квадрат, в вашем случае), и вы складываете эти прямоугольники для создания третьего измерения. Если вы хотите изменить размер 3-го измерения на 10 элементов, вы должны добавить еще 9 кусков 100x100. Это будет одна операция изменения размера вектора.

Если вы хотите сделать это с помощью векторного вектора, вы должны выполнить 10 000 операций изменения размера вектора. Вы будете распространять свои хранилища элементов по всей куче и получать ужасную производительность из-за промахов в кеше.

+0

Это работает, даже если MyClass определен в .cpp? – Nathan

+0

Я ввел конструктор в этом примере (* ie * определение в том же месте, что и объявление). Вы можете определить конструктор в CPP-файле, а именно: MyClass :: MyClass(): matrix (...) {} '. Я использовал '...' для краткости. В этом случае объявление в классе просто: 'MyClass();'. Возможно, вы должны найти вводный учебник по C++ – paddy