for_each调用将无法使用指针向量
for_each call will not work with vector of pointers
我正在使用指针向量来释放堆中的一系列节点对象。矢量具有所有的节点对象地址,并且有一个函数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
是一个非静态成员函数。如果是这样,则不能仅使用delete_nodes
作为std::for_each
的参数。std::for_each
需要一个函子。您的delete_nodes
不是函子。
首先,要获得指向非静态成员函数的指针,总是需要&
运算符和限定名称。在C++中,仅仅是非静态成员函数的名称(只是delete_nodes
)并不是一个有效的表达式。你必须做&Huff::delete_nodes
。
其次,指向成员函数的指针(与指向"普通"函数的指针相反)不是函子。为了把它变成一个函子,你可以使用std::mem_fun
函数。这将为您提供一个二进制函子,因为std::mem_fun
将把隐式this
参数变成显式参数。为了将其转换为std::for_each
所需的一元函子,您必须将第一个参数绑定到特定的对象指针值(可能是this
?)。
上述步骤的最终结果将看起来像
bind1st(mem_fun(&Huff::delete_nodes), this)
这是一个一元函子,它为this
对象调用delete_nodes
。
因此,您的示例中的for_each
调用应该如下所示
for_each(nodes_delete.begin(), nodes_delete.end(),
bind1st(mem_fun(&Huff::delete_nodes), this));
然而,在您的实现中,delete_nodes
似乎可以变成静态成员函数。静态成员函数是一个"普通"函数,意味着它是一个函子,可以直接使用。也就是说,如果你使delete_nodes
静态,你的代码应该按原样工作。
决定你想走哪条路,并做出必要的改变。
您正试图将一个无界成员函数作为函子传递。您必须使用例如std::mem_fn和bind将其绑定到当前对象。
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量