Я использую вектор указателей, чтобы освободить ряд объектов узла в куче. В векторе есть все адреса узловых объектов, и есть функция delete_nodes, которая используется с циклом for_each для удаления всех узлов в векторе. По какой-то причине я получаю следующую ошибку в eclipse cdt с циклом for_each, подчеркнутым красным:
error: no matching function for call to 'for_each(__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, __gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, <unresolved overloaded function type>)'
Код предназначен для кодирования Хаффмана, а цикл for_each находится в самом конце. Вектор nodes_delete создается прямо перед циклом while.
void Huff::delete_nodes(Node*n){//this is used to delete all the nodes in the binary tree at the end of Huff::compress()
delete n;
}
vector<Code>* Huff::compress(){
//-------GETTING WEIGHTS/FREQUENCIES------
vector<Node *>* nodes = new vector<Node*>; // Vector of nodes for later use
map<char, int>* freq = new map<char, int>; // Map to find weight of nodes
for(unsigned int i = 0; i < content.length(); i++)
(*freq)[content[i]]++;
CopyTo copyto(nodes); //sets vector<Node*> to copy to
for_each(freq->begin(), freq->end(), copyto); // Copies
delete freq;
vector<Node *>::iterator beg = nodes->begin();
//-------SETTING UP TO BUILD TREE------
if(nodes->size() % 2 == 1){ //makes sure there are an even number of nodes
Node* fill = new Node;
fill->set_node(0, '*', NULL, NULL);
nodes->push_back(fill);
}
huff_sort(nodes); // sort nodes by weight
vector<Node*> nodes_delete(*nodes); //this is used to delete all the nodes in the binary tree at the end
//-------BUILDING TREE------
while(nodes->size() != 1){ //Sorts nodes by weight and then removes two of them and replaces them with one
int w= (**beg).weight + (**(beg+1)).weight;
Node* p = new Node;
p->set_node(w, '*', *nodes->begin(), *(nodes->begin()+1)); //making it the parent node of the two lowest nodes
nodes->erase(nodes->begin(), nodes->begin()+2);
unsigned int i = 0;
while(w > (*nodes)[i]->weight && i <= nodes->size()){ //finds where to insert the parent node based on weight
i++;
}
if(i > nodes->size()) //if it needs to be inserted at the end
nodes->push_back(p);
else
nodes->insert(nodes->begin()+i, p);
}
//-------TRAVERSING TREE------
Node* root = (*nodes)[0];
delete nodes;
vector<Code>* codes = new vector<Code>;
traverse(root, codes , "");
delete root;
for_each(nodes_delete.begin(), nodes_delete.end(), delete_nodes);
return codes;
}
delete_nodes
? В приведенном выше коде я вижу только один, но вы проверяли, есть ли еще один, возможно, в одном из заголовочных файлов? - person jogojapan   schedule 25.07.2012delete_nodes
определена как статическая функция-член. Это действительно правильно? Если нет, Matteo Italia ниже прав (хотя я бы нашел сообщение об ошибке компилятора в этом случае довольно вводящим в заблуждение). - person jogojapan   schedule 25.07.2012vector<T>&
для заполнения функцией. - person Ed S.   schedule 25.07.2012new
иdelete
. Возможно, вы захотите переосмыслить то, что вам нужно (может быть полезна книга по C++) - person David Rodríguez - dribeas   schedule 25.07.2012new
, и, конечно же, вы можете обойтись безdelete
(используя смарт-контейнеры для тех немногих случаев, когда вы действительно нужно динамически выделять). Какой у тебяNode
тип? Вам нужно хранить указатели на него вstd::vector
? Или, может быть, достаточно просто значений? Чем меньше указателей вы используете, тем проще код. - person David Rodríguez - dribeas   schedule 25.07.2012