C ++ for_each算法和字符串

时间:2014-08-01 02:41:51

标签: c++ foreach

我正在尝试使用for_each,

遍历字符串的每个字母
std::unordered_map<std::string, unsigned int> dico;
std::for_each(str.begin(),str.end(),[&](std::string l){
if(dico.count(l) == 0){
     ' DO SOMETHING HERE
})

但是,我收到一条错误消息:

Error   2   error C2664: 'void `anonymous-namespace'::<lambda2>::operator ()(std::string) const' : cannot convert parameter 1 from 'const char' to 'std::string'

我尝试更改为char l,然而,它会中断dico.count(l)。相反,我见过其他人使用for loop代替。该解决方案有效。但是,我想知道为什么for_each在这里不起作用。

3 个答案:

答案 0 :(得分:1)

    std::unordered_map<std::string, unsigned int> dico;
    dico["a"] = 1;
    dico["b"] = 1;
    dico["c"] = 1;
    std::string str("abcd");
    std::for_each(str.begin(),str.end(),[&](char l){
        std::string s(1,l); // fixed
        if(dico.count(s) == 0){
            std::cout << "1" << std::endl;
        }});

这应该有效。

问题是您无法使用string初始化char,您需要另一个string(C ++字符串)或const char*(C字符串)。< / p>

除此之外,您实际上可能会定义std::unordered_map<char, unsigned int>


根据Rob Kennedy的评论编辑:

修正const char* cc = &l的错误使用。

现在调用std::string的正确ctor。

答案 1 :(得分:0)

首先,str究竟是什么?它的类型是什么,它包含什么?

其次,dico什么都不包含,所以,即使你的代码是正确的并且编译完成,该分支也会为str中的每个项执行。

第三,首先让逻辑正确。使用简单的for循环来做。代码越复杂,您花在解决问题上的时间就越长。

最后,如果您只是尝试使用某些C ++ 11功能,请从更简单的功能开始,例如for range循环:)

for(auto l : str){
 if(dico.count(l) == 0){
   // do something
 }
}

答案 2 :(得分:0)

std :: unordered_map :: value_type是对 不是字符串!

std::unordered_map<std::string, unsigned int> dico;
std::for_each(str.begin(),str.end(),[&](pair<std::string, unsigned int> l){ 
if(dico.count(l.first) == 0){
 ' DO SOMETHING HERE
})

它应该有用。

相关问题