我之前没有使用过STL,但我开始研究这个霍夫曼压缩项目。除了“for_each”函数之外,其他所有东西似乎都有效,除了函数参数之外。由于我通常不使用xcode(我通常使用eclipse cdt)我不确定问题是我的代码还是xcode。
这是Huff.h文件
class Huff {
private:
typedef pair<char, int> c_pair;
vector<Node> nodes;
vector<Code> code;
string content;
void copy_to(c_pair c);
public:
Huff(string);
~Huff();
string compress();
bool set_content();
string get_content();
string get_compress();
};
这是Huff.cpp文件中不起作用的部分。
//---Compress---
void Huff::copy_to(c_pair c){
Node n(c.second, c.first, NULL, NULL);
nodes.push_back(n);
}
string Huff::compress(){
map<char, int> freq;
for(int i = 0; i < content.length(); i++)
freq[content[i]]++;
for_each(freq.begin(), freq.end(), copy_to); //I've also tried this->copy_to
return "110";
}
答案 0 :(得分:3)
for_each(freq.begin(), freq.end(), copy_to); //I've also tried this->copy_to
copy_to
是一个无法传递给std::for_each
的成员函数。
你需要的是一个不需要隐式this
的可调用实体:这样的实体可以是 functor 或自由函数,在C中++ 11, lambda 也。
如果可以使用lambda解决方案,那将非常简单:
for_each(freq.begin(),
freq.end(),
[this](c_pair & c) { this->copy_to(c); } );
在这里了解lambda表达式:
答案 1 :(得分:2)
正如所指出的,你不能以for_each
的方式使用成员函数。
C ++ 03替代方法是使用mem_fun
和bind1st
来构建函数对象:
std::for_each(freq.begin(), freq.end(),
std::bind1st(std::mem_fun(&Huff::copy_to), this));
或使用Boost.Bind:
std::for_each(freq.begin(), freq.end(),
boost::bind(&Huff::copy_to, this, _1));