0

我以前很少使用 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";
}
4

2 回答 2

3
for_each(freq.begin(), freq.end(), copy_to); //I've also tried this->copy_to

copy_to是不能传递给的成员函数std::for_each

您需要的是一个不需要隐式的可调用实体this:这样的实体可以是仿函数自由函数,在 C++11 中,也可以是lambda

如果您可以使用 lambda 解决方案,它将非常简单:

for_each(freq.begin(), 
         freq.end(), 
         [this](c_pair & c) { this->copy_to(c); } ); 

在此处了解 lambda 表达式:

于 2012-06-30T13:13:07.213 回答
2

正如所指出的,您不能以这种方式使用成员函数for_each

C++03 的替代方法是使用mem_funbind1st构建一个函数对象:

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));
于 2012-06-30T13:21:36.443 回答