Нахождение NULL в векторе - PullRequest
       3

Нахождение NULL в векторе

6 голосов
/ 08 сентября 2011

Я хотел бы выяснить, содержит ли вектор указателей запись NULL, предпочтительно с использованием кода в STL и без записи цикла. Я пробовал это выражение:

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

Но я получаю ошибки, говорящие мне, что у меня есть "сравнение между указателем и целым числом". Есть ли лучший способ сделать это?

Ответы [ 3 ]

12 голосов
/ 08 сентября 2011

NULL в C ++ - это целочисленная константа.Преобразование указателя неявно в соответствующих контекстах, но это не так.Вам нужно привести в явном виде:

std::find(dependent_events.begin(), dependent_events.end(), static_cast<P>(0));

Где P - соответствующий тип указателей в коллекции.В качестве альтернативы, Эдди правильно указал решение C ++ 11, которое должно работать в современных компиляторах (если включен C ++ 11).


Причина, по которой простой NULL не работаетзаключается в следующем: C ++ запрещает неявное преобразование целого числа в указатель.Существует только одно исключение: буквальное значение 0 обрабатывается как нулевой указатель при инициализации и присваиваниях указателям (литерал 0 действует как «константа нулевого указателя», §4.10) и NULL это просто 0 (§18.1.4).

Но при использовании в создании экземпляра шаблона (например, в приведенном выше вызове find), C ++ должен выводить тип шаблона для каждого изего параметры и тип, выведенный для 0, равен , всегда один и тот же : int.Так что find вызывается с аргументом int (который внутри функции больше не является литерал ) и, как упоминалось выше, не существует неявного преобразования между int и указателем.

11 голосов
/ 08 сентября 2011

Попробуйте

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 голосов
/ 08 сентября 2011

Просто приведите NULL в качестве указателя. В C ++ NULL - это просто целочисленная константа.

std::find(dependent_events.begin(), dependent_events.end(), (int *)NULL);

Очевидно, замените любой тип данных для вектора int *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...