STL список <mystruct>возврат проблемы - PullRequest
0 голосов
/ 09 апреля 2011

Я пытаюсь использовать список STL в проекте, но у меня есть следующая проблема.

Я хочу, чтобы в моем списке сохранялась структура.Например, этот

struct mystruct
{
    int x;
    int y;
};

Затем я использую итератор для доступа к каждой структуре в списке следующим образом.

list<mystruct> L;
list<mystruct>::iterator lit;
for(lit=L.begin();lit!=L.end();lit++) 
    {
        if(lit->x==1) cout << "<NUM," << lit->x << "> ";
        if(lit->y==2) cout << "<ID," << lit->y << "> ";
    }

Это работает, но я хочу получить одну структуру за разтаким образом я сделал это func

mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

, но я получаю ошибку после запуска, и я не могу понять, почему это происходит.

Есть идеи, что не так?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2011
mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

Вы увеличиваете, если вы уже не в конце, но разыменование происходит каждый раз, независимо от того, находитесь ли вы в конце или нет.Чтобы обойти эту проблему, рассмотрите возможность возврата указателя, а затем указателя 0, если вы находитесь в конце.где вы используете Myclass::next.

1 голос
/ 09 апреля 2011

Если вы пишете next(), который возвращает объект (а не указатель), то я думаю, что вам также нужно написать has_next() функцию, которую вы должны вызывать, чтобы проверить, есть ли элемент в списке или нет, перед звонит next(). Примерно так:

bool has_next()
{
   list<mystruct>::iterator temp = lit;
   return ++temp != L.end();
}

mystruct Myclass::next(void)
{
    if( !has_next()) 
    {
         throw "end of the list is reached";
    }
    ++lit;
    return *lit;
}

//usage
while(myClassInstance.has_next())
{
      mystruct s = myClassInstance.next();
      //work with s
}

Или, если вы решите вернуть указатель на mystruct из next(), то has_next() не так уж и нужен. Вы можете написать это:

mystruct *  Myclass::next(void)
{
    ++lit;
    if( lit == L.end() ) 
         return NULL;
    return &(*lit);
}
0 голосов
/ 09 апреля 2011

Проблема здесь:

mystruct Myclass::next(void)
{
    if(lit!=L.end()) 
    {
        lit++;
    }
    return *lit;
}

Во-первых, как освещено определено?
Во-вторых, если освещено равно L.end (), вы должны вернуть некоторое значение по умолчанию, а не разыменовывать его, потому чтоесли вы делаете, вы вызываете неопределенное поведение.Если вам повезет, ваша программа потерпит крах.

...