2015-09-22 4 views
1

Я использую C++ 11 std::list и список итераторов. Я использую вложенные циклы и проверяю условие, и если это удастся, я использую оператор goto, чтобы выйти. Псевдокод показано ниже:Проблема, использующая for loop и goto statement

std::list<myclass>::iterator tmpItr; 
std::list<myclass>::iterator tmpItr2; 
std::list<std::list<myclass>::iterator>::iterator radItr; 
double cutoffVal = someVal; 
double currVal = 0.0; 

for (radItr=radList.begin();radItr!=radList.end();radItr++) { 
    tmpItr2 = *radItr; 
    for (tmpItr=pList.begin();tmpItr!=pList.end();tmpItr++) { 
     if (tmpItr == tmpItr2) 
      continue; 

     /* Some Operation Here */ 
     currVal += NewVal; 
     if (currVal >= cutoffVal) 
      goto BREAKLOOP; 
    } 
} 

BREAKLOOP: 
// Use tmpItr and tmpItr2 

Моя проблема заключается в том, что когда-то значение tmpItr идет к list.end() и я получаю ошибку сегментации. Описывает ли заявление goto сообщение о приращении здесь?

+0

Я также попытался добавить еще один класс итератора между продолжать и операции, как tmpItr3 = tmpItr. В случаях, когда я получаю ошибку сегментации, т. Е. TmpItr указывает на list.end(), tmpItr3 этого не делает. Что указывает на то, что во время разрыва цикла tmpItr изменился – Amit

+0

Это не связано с 'goto', и это не должно быть проблемой, если /, когда ваш итератор равен' list.end() '. –

+0

Какой смысл сравнивать два итератора с разными списками ??? – SergeyA

ответ

1

Я не уверен, что это исправит проблему с вашими итераторами, но большинство людей, с которыми я говорю, считают, что goto's в C++ - это плохой код. Почему бы не заменить Гото с:

(bool)breakout=true; 
    break; 
    } 
if(breakout)break; 
+1

Да, 'goto' довольно плохой, но я не уверен, что это решение лучше, особенно учитывая, что теперь предлагает нам C++ 11 (здесь, например, мы могли бы легко использовать лямбда, чтобы вложить петли в , а затем ранний выход из него. –

+0

Для вложенных циклов, я думаю, что «goto» не так уж плохо. Неужели это – Amit

0

Я думаю, ваша проблема возникает, когда goto является не достиг:

for (...; radItr != radList.end(); ...) { 
    for (...; tmpItr != pList.end(); ...) { 
     if (...) 
      goto BREAKLOOP; 
    } 
} 

// At this point, radItr==radList.end() && tmpItr==pList.end() 

BREAKLOOP: 
+0

Я понял это. Вы правы. Я ошибочно делал расчет с использованием не существующего векторный элемент. В отличие от массива, я предполагаю, что вектор содержит дополнительные пробелы, и именно поэтому я не получал ошибку сегментации в этом месте, но когда вычисление выходит из циклов (не переходя к 'goto'), и итератор указывает на несуществующий элемент. . Спасибо за ваши комментарии :) – Amit