首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL for_each不能在Xcode中使用map

STL for_each不能在Xcode中使用map
EN

Stack Overflow用户
提问于 2012-06-30 21:08:11
回答 2查看 579关注 0票数 0

我以前不经常使用STL,但我开始使用这个huffman压缩项目。除了"for_each“函数之外,似乎所有的东西都能正常工作,除了一个函数参数。因为我通常不使用xcode (我通常使用eclipse cdt),所以我不确定问题出在我的代码还是xcode上。

这是Huff.h文件

代码语言:javascript
复制
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文件中不起作用的部分。

代码语言:javascript
复制
//---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";
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-30 21:13:07

代码语言:javascript
复制
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解决方案,那么它将非常简单:

代码语言:javascript
复制
for_each(freq.begin(), 
         freq.end(), 
         [this](c_pair & c) { this->copy_to(c); } ); 

在这里了解lambda表达式:

票数 3
EN

Stack Overflow用户

发布于 2012-06-30 21:21:36

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

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

代码语言:javascript
复制
std::for_each(freq.begin(), freq.end(), 
              std::bind1st(std::mem_fun(&Huff::copy_to), this));

或者使用Boost.Bind

代码语言:javascript
复制
std::for_each(freq.begin(), freq.end(), 
              boost::bind(&Huff::copy_to, this, _1));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11274303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档