我正在尝试使用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
在这里不起作用。
答案 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
})
它应该有用。