Я уже довольно давно работаю над деревом avl, основанным на векторе. Я должен брать входные данные из файла, но на 4118-м вводе выдает ошибку bad_alloc. Я провел небольшое исследование и собрал данные, которые мне также нужны для резервирования места. Но даже когда я выделяю место, все равно выдает ту же ошибку.
части моего кода:
Я вызываю эту функцию:
void insert(T d, unsigned int c = 1);
find(T d) находит позицию newNode в vector<node<T>*> myVector
; он вернет позицию, даже если не найдет newNode. Вставка позаботится о возвращаемом целом числе (показано ниже)
вставка:
template<typename T>
void binaryTree<T>::insert(T d, unsigned int c)
//inserts type T with count c into vector
{
node<T>* newNode = new node<T>(d,c);
if(myVector.empty())
{
myVector.push_back(newNode);
}
else
{
int r = find(d);
total++;
//if newNode has same data as the data in position r
if(r < myVector.size() && myVector[r] && *newNode == *myVector[r])
{
myVector[r]->data.loc.push_back(newNode->data.loc[0]);
myVector[r]->count += newNode->count;
delete newNode;
return;
}
//insert into vector normally
else
{
checkSpace(r);
myVector[r] = newNode;
//reParent(r);
}
}
}
с checkSpace:
template<typename T>
void binaryTree<T>::checkSpace(int i)
//resizes the vector if needed
{
if(i >= myVector.size())
{
myVector.resize(rightOi(i),NULL);
}
}
и void reParent(r) является основной функцией, которая выполняет все повороты и балансировку. Я закомментировал reParent(r) и, возможно, выделил проблему только в функции вставки. Я довольно новичок в этом, и я ценю любую помощь. Заранее спасибо.
правая функция:
template<typename T>
//return the right position of i
int binaryTree<T>::rightOi(int i)
{
return i*2 + 2;
}
resize
для вектора. Используйтеpush_back
илиinsert
. - person Kerrek SB   schedule 07.04.2014newNode
. Что происходит, когда он уже находится в дереве? Вы сравниваете разыменованный узел и узел с прорезями и просто увеличиваете количество узлов дерева. Как вызывающий узнает, что вы не вставилиnewNode
и, следовательно, ему нужно его удалить? Вы возвращаетеvoid
, поэтому я не вижу никаких признаков того, что вызывающему абоненту сообщают, чтоnewNode
все еще горячо на их стороне и не принадлежит дереву. - person WhozCraig   schedule 07.04.2014std::vector<node<T> >
?) - person Jonathan H   schedule 07.04.2014new
?), и я хотел бы убедиться, что вы удалили их правильно. Это очень неэффективно, с векторами указателей не всегда просто обращаться, и в этом случае я уверен, что они не нужны. - person Jonathan H   schedule 07.04.2014std::vector<node<T> >
. Я не предлагаю вам возвращать вектор узлов в любом месте, вектор должен быть атрибутом вашего класса, который служит контейнером (т. е. основанная на векторе реализация); в этом случае нет причин, по которым я могу видеть, когда вам придется вызывать конструктор копирования. Если вы придумали медленную реализацию, я бы хотел ее увидеть. Если вы говорите о конструкторе копированияnode<T>
, вы должны использовать ссылки. Если вы вставляете новые узлы по значению, рассмотрите вместо этогоemplace
. - person Jonathan H   schedule 07.04.2014