为什么像这样使用find_if失败
Why using find_if like this fail?
我想从映射中找到第一个非零元素,因此我做了以下代码:
#include <map>
#include <iostream>
#include <algorithm>
bool nonzero(std::map<char,int>::const_iterator& it);
int main() {
std::map<char, int> m;
m['a'] = 0;
m['b'] = 1;
std::map<char,int>::iterator it = std::find_if(m.begin(), m.end(), nonzero);
std::cout << it->first << 't' << it->second << std::endl;
return 0;
}
bool nonzero(std::map<char,int>::const_iterator& it) {
return it->second;
}
g++给出了非常复杂的错误,说:
/usr/include/c++/5/bits/predefined_ops.h:234:30: error: invalid initialization of reference of type ‘std::_Rb_tree_const_iterator<std::pair<const char, int> >&’ from expression of type ‘std::pair<const char, int>’
{ return bool(_M_pred(*__it)); }
我不明白它在说什么,也不明白为什么我的程序会失败。
find_if
调用的nonzero
函数所需的类型不是std::map<char,int>::const_iterator&
,而是const std::pair<const char, int> &
。
事实上,如果你查看一些find_if
的在线文档,你会发现一元谓词的形式是:
bool UnaryPredicate(const Type&)
其中Type
在您的情况下是std::pair<const char, int>
(对于一般的std::map<Key, Value>
,类型为std::pair<const Key, Value>
(。
因此,您可以将传递const&
的函数调整为std::pair
:
bool nonzero(const std::pair<const char, int> & p)
{
return (p.second != 0);
}
请注意,将C++14 auto
与lambdas一起使用会简化您的代码,例如:
auto it = std::find_if(m.begin(), m.end(), [](const auto& p){
return (p.second != 0);
});
还要注意,该对具有一般形式std::pair<const Key, Value>
(而不仅仅是具有非常量密钥的pair<Key, Value>
(。
find_if
将value_type
(实际上是iterator.operator*()
(传递给传递给它的函数/函数对象。您的nonzero
应该接受std::map<char,int>::value_type const&
作为参数,或者更简洁地说:std::pair<const char, int> const&
bool nonzero(std::pair<const char, int> const& element) {
return it.second;
}
请注意,该对的密钥是const
。如果省略它,您将复制您检查的每个map元素。
如果您可以使用C++14或更新版本,您也可以使用auto
和通用lambda:使其更短
auto it = std::find_if(m.begin(), m.end(), [](auto const& pair){ return p.second; });
和C++11版本:
auto it = std::find_if(m.begin(), m.end(), [](std::pair<const char, int> const& pair){ return p.second; })
函数接受:
bool nonzero(const std::map<char,int>::value_type& value);
它是std::pair<const char,int>
,而不是迭代器
在使用迭代器之前,您应该通过与std::map::end()
进行比较来检查find_if
的结果。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在 if 语句中调用重载构造函数失败
- C++ IF流文件已打开,但失败
- if(!buydat.empty()) 验证失败(始终为 true)
- 使用模板检查结构体中的字段,启用函数if,并在失败时给出一个漂亮的错误消息