Итератор C ++ Vector не разыменовывается после добавления дополнительных данных - PullRequest
0 голосов
/ 05 февраля 2012

Товарищи

Не работает следующее:

vector<string>::iterator c;

for( c = holdtype.begin(); c != holdtype.end(); c++)
{ 
    if( *c == "preposition" )
    {
        c++; 
        if( *c == "unknown" )
        {       
            c++;  
            if( *c == "unknown" )
            {
                c++;  
                if( *c == "unknown" )
                {
                    cout <<endl <<"This should be a verb " << *c;
                }
            }
        }
    } 
}

Странно то, что он работает для определенного количества данных. Как только оно выходит за рамки примерно 30 слов, оно перестает работать и выдает «ошибку без разыменования».

Я пробовал это, и это дает те же результаты:

vector<string>::iterator c;
c = holdtype.begin();

while( c != holdtype.end())
{ 
    if( *c == "preposition" )
    {
        if( c != holdtype.end() ) { c++; } else { break; }
        if( *c == "unknown" )
        {       
            if( c != holdtype.end() ) { c++; } else { break; }
            if( *c == "unknown" )
            {
                if( c != holdtype.end() ) { c++; } else { break; }
                if( *c == "unknown" )
                {
                    cout <<endl <<"This should be a verb " << *c;
                }
            }
        }
    } 
    if( c == holdtype.end() ) { break; } else {c++;}
}

Я пытаюсь понять это уже несколько дней, я новичок.

Ответы [ 3 ]

1 голос
/ 05 февраля 2012

Ваша вторая версия почти верна, но вам нужно проверить, действительно ли c действителен после увеличения и перед разыменованием:

vector<string>::iterator c;
c = holdtype.begin();

while( c != holdtype.end())
{ 
    if( *c == "preposition" )
    {
        ++c;
        if( c == holdtype.end() ) { break; }
        if( *c == "unknown" )
        {       
            ++c;
            if( c == holdtype.end() ) { break; }
            if( *c == "unknown" )
            {
                ++c;
                if( c == holdtype.end() ) { break; }
                if( *c == "unknown" )
                {
                    cout <<endl <<"This should be a verb " << *c;
                }
            }
        }
    } 
    ++c;
}
1 голос
/ 05 февраля 2012

Вы потенциально разыменовываете конечный итератор в обоих случаях.Предположим, что ваш вектор заканчивается «предлогом».

В первом примере у вас вообще нет защиты от удара end().Поэтому, когда вы нажмете последнюю «предлог», вы начнете разыменовываться.

Во втором примере ваша защита обратная.Вам нужно проверить, находится ли итератор в конце после увеличения, а не до.

1 голос
/ 05 февраля 2012

Представьте, что ваш вектор содержит только одну строку, "предлог".

Теперь ваше выполнение делает это:

  1. Начните итерацию, итератор указывает на первый элемент вектора
  2. Сравните разыменованный итератор с «предлогом»
  3. Match!
  4. Инкрементный итератор.Итератор теперь равен holdtype.end().
  5. Попытка разыменовать итератор, чтобы сравнить его с «неизвестным» (код: *c == "unknown")
  6. Ошибка, так как вы не можете получить «содержимое»std::vector::end() специальное значение.

Вы фактически пытаетесь получить доступ к элементу за концом вашего вектора, в первом фрагменте кода.Во втором все c != holdtype.end() проверки успешно защищают от этого.

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