在向量中查找NULL

时间:2011-09-08 19:09:29

标签: c++ stl

我想知道一个指针向量是否包含一个NULL的条目,最好是使用STL中的代码而不是写一个循环。我试过这个表达式:

std::find(dependent_events.begin(), dependent_events.end(), NULL)

但是我收到错误告诉我,我有一个“指针与整数之间的比较”。有更好的方法吗?

3 个答案:

答案 0 :(得分:12)

C ++中的

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 *

保留的任何类型的数据