Я могу создать динамический размер массива целых чисел, как это:
int *cacheL2 = new int[L2/B2];
и я также могу создать объект типа Data
как это:
Data one(12,12);
и теперь я хочу динамически размерный массив Data
:
Data * vlaObj = new Data[L2/B2];
Но это не работает…
Также, если вы можете сказать мне, как заставить хеши работать на c ++, это было бы здорово. Я искал примеры, но все просто говорит #include «hash_map», однако, когда я пытаюсь использовать библиотеку, кажется, что я не могу найти ни одного из них.
#include <vector>
// ...
std::vector<Data> v;
v.emplace_back( 12, 12 );
Нет причин не использовать контейнеры STL здесь. Рекомендуется использовать std::vector
вместо сырых указателей:
#include <vector>
//...
std::vector<Data> vlaObj(L2/B2);
vlaObj.push_back(one)
Изменить: Кстати, есть ли вероятность, что значение L2 или даже B2 может быть 0
?
Одна из наиболее вероятных причин, почему Data* arr = new Data[len];
не будет работать, потому что тип Data
не имеет конструктора по умолчанию, т.е. Data::Data()
,
Но неважно, Data
имеет конструктор по умолчанию или нет, не рекомендуется создавать такой массив в любом случае. Как только вы динамически выделяете его new[]
Вы обязуетесь позаботиться об уродливом управлении памятью, связанном с ним. Намного лучше использовать один из контейнеров STL, например: std::vector
(#include <vector>
требуется), который позаботится об управлении памятью для вас.
Тогда у вас есть несколько вариантов:
std::vector<Data> v; // option 1
v.reserve(len);
// in loop:
v.push_back(Data(x, y)); // there could be different values
std::vector<Data> v2(len); // option 2
std::vector<Data> v3(len, Data(12,12)); // option 3
Первый вариант подойдет практически в любой ситуации. Это готовит кусок памяти, достаточно большой, чтобы держать len
элементы, а затем вы можете просто заполнить v
в удобной, но все же очень эффективной манере. Вариант 2 требует Data
иметь конструктор по умолчанию, который решается с помощью варианта 3, который использует ваш собственный конструктор для создания элементов.
Все перечисленные варианты приводят к std::vector
объект с автоматической продолжительностью хранения создается. Обратите внимание, что все элементы хранятся в непрерывном блоке памяти, поэтому вы можете использовать &v[0]
чтобы инициализировать указатель на его первый элемент и работать с ним так же, как если бы вы работали с динамически размещенным массивом.