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です。

必要なのは、 Implicit を必要としない呼び出し可能なエンティティです。そのようなエンティティは、 functorまたはfree functionthisのいずれかであり、C++11 ではラムダでもあります。

ラムダソリューションは、使用できれば非常に簡単です。

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

ここでラムダ式について学んでください:

于 2012-06-30T13:13:07.213 に答える
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));
于 2012-06-30T13:21:36.443 に答える