我想知道一个指针向量是否包含一个NULL的条目,最好是使用STL中的代码而不是写一个循环。我试过这个表达式:
std::find(dependent_events.begin(), dependent_events.end(), NULL)
但是我收到错误告诉我,我有一个“指针与整数之间的比较”。有更好的方法吗?
答案 0 :(得分:12)
NULL
只是一个整数常量。指针转换隐含在适当的上下文中,但这不是一个。你需要明确地施放:
std::find(dependent_events.begin(), dependent_events.end(), static_cast<P>(0));
其中P
是集合中指针的适当类型。或者,Eddie正确地指出了C ++ 11解决方案,该解决方案应该适用于现代编译器(如果已启用C ++ 11)。
普通NULL
不起作用的原因如下:C ++禁止将整数隐式转换为指针。只有一个例外,文字值 0
在初始化和指针赋值中被视为空指针(文字0
充当“空指针常量”,§ 4.10),而NULL
只是0
(第18.1.4节)。
但是当在模板实例化中使用时(例如在上面对find
的调用中),C ++需要推断其每个参数的模板类型,并且推断0
的类型是总是相同的:int
。所以使用find
参数(在函数内部,不再是 literal )调用int
,如上所述,{{1}之间没有隐式转换和一个指针。
答案 1 :(得分:11)
尝试
std::find(dependent_events.begin(), dependent_events.end(), nullptr)
假设您使用的是新的c ++ 11标准。
就像我在上面的评论中所说,NULL实际上是一个#define NULL 0,一个更精确的整数。
如果不使用c ++ 11,请尝试:
std::find(dependent_events.begin(), dependent_events.end(), static_cast<void*>(NULL));
答案 2 :(得分:2)
只需将NULL
转换为指针。在C ++中,NULL
只是一个整数常量。
std::find(dependent_events.begin(), dependent_events.end(), (int *)NULL);
显然可以替换向量为int *