Почему if-case true ?!Помогите мне понять, почему find возвращает что-то другое, чем end() на std :: set, когда set пуст
typedef std::set< boost::shared_ptr<CCall>, HasFirstQueuedLongerTime> queued_container;
queued_container::iterator itTemp = queued.find(spCall);
queued_container::iterator itTempEnd = queued.end();
if(itTemp != itTempEnd) //<-- is true
queued
является пустой std::set
и spCall
является общим указателем на объект. Поскольку queued
пуст, функция поиска должна возвращать итератору, равную queued.end()
...
Im компиляция и отладка на vs2005. Я вижу, что itTemp
и itTempEnd
указывает на тот же адрес.
Благодарен за ответы!
Подробнее код, следующий объявлен перед тем Условный оператор:
queued_container queuedCalls;
const boost::shared_ptr<CCall> &spCall; //spCall is valid according to debug info.
struct HasFirstQueuedLongerTime : std::binary_function < boost::shared_ptr<CCall>, boost::shared_ptr<CCall>, bool> {
bool operator() (const boost::shared_ptr<CCall>& lhs, const boost::shared_ptr<CCall>& rhs) const
{
return lhs->CreatedTime() < rhs->CreatedTime(); //returns true if lhs queued longer time than rhs
}
};
Мой реальный исполняемый код:
queued_container::iterator itTemp = queued.find(spCall);
queued_container::iterator itTempEnd = queued.end();
if(itTemp != itTempEnd)
AS_ERROR(1, "XXX", "ERROR: Already added to queue container.");
queued.insert(spCall);
CCallQueue::insert(spCall);
Ps. Извините за многие изменения ..
Название довольно неоднозначное. Я бы ожидал, что `find` потерпит неудачу в пустых наборах. Но это «сбой», как в «возвращает итератор до конца коллекции». – MSalters 2010-12-09 15:28:23
@ user521048: Создайте реальную автономную тестовую запись. Приведенное выше не дает достаточной информации для диагностики проблемы. – wilx 2010-12-09 15:29:25