STL for_each在Xcode中不使用map

时间:2012-06-30 13:08:11

标签: c++ xcode stl functor

我之前没有使用过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";
}

2 个答案:

答案 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_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));