2016-05-15 1 views
0

У меня есть список символов, который выполняет моя программа. Поскольку мой цикл for проверяет каждый символ, я применяю несколько тестов.C++ List Iterator Перезапустить действия, если смена списка

Что мне нужно сделать, это если один из тестов изменит список (т. Е. Хеш изменен), снова перезапустите тесты с самого начала. Только если все тесты завершены, мой цикл «for» будет продолжать следующий символ.

Возможно, работающий цикл может работать, но у меня проблемы.

В примере результат должен быть «ty», а не «ttty».

 #include <iostream> 
    #include <list> 

    using namespace std; 

    void testOne(); 
    void testTwo(); 
    void print(); 
    unsigned short calculateHash(list<char> &charList); 

    list<char> charList; 
    list<char>::iterator iter; 
    list<char>::iterator iter2; 

    int main(int argc, char *argv[]){ 

     charList.push_back('t'); 
     charList.push_back('t'); 
     charList.push_back('t'); 
     charList.push_back('t'); 
     charList.push_back('t'); 
     charList.push_back('x'); 

     print(); 
     cout << "Hash = " << calculateHash(charList) << '\n'; 

     for(iter = charList.begin(), iter2 = ++charList.begin(); iter != charList.end(); ++iter, ++iter2) { 


      unsigned short hash; 
      hash = calculateHash(charList); 

      // if one of the tests changes the list 
      // start the tests again... 

      //while (hash == calculateHash(charList)) 

      // loop here. 
      testOne(); 
      testTwo(); 

     } 
     print(); 
     cout << "Hash = " << calculateHash(charList) << '\n'; 
    } 

    void testOne() { 
     if (*iter == *iter2) { 
      charList.erase(iter2); 
      iter2 = iter; 
      ++iter2; 
     } 
    }; 

    void testTwo() { 
     if (*iter == 'x') 
      (*iter) = 'y'; 

    }; 

    void print() { 
     list<char>::iterator it; 
     for(it = charList.begin(); it != charList.end(); it++) 
      cout << *it; 

     cout << '\n'; 
    }; 

    unsigned short calculateHash(list<char> &charList) { 
     unsigned short shift, hash = 0; 
     list<char>::const_iterator itr; 
     for (itr = charList.begin(); itr != charList.end(); itr++) { 
      hash ^= *itr; 
      shift = (hash & 15); 
      hash = (hash << shift) | (hash >> (16 - shift)); 
     } 
     return hash; 
    }; 

ответ

0

вы должны использовать что-то во время цикла, как этот

iter = charList.begin(); 
while (iter != charList.end()) { 
    hash = computeHash(); 
    testOne(); 
    newhash = computeHash(); 
    if (hash != newHash) { 
     iter = charList.begin(); 
     continue; 
    } 
    /* do the same for all other tests*/ 
    iter++; 
} 
0

Я хотел бы написать это как цикл:

bool reset; 
for (auto it = charList.begin(); 
    it != charList.end(); 
    it = (reset ? charList.begin() : it+1)) 
{ 
    const unsigned short hash = calculateHash(charList); 

    // loop here. 
    // Note both functions need to return true if the loop should be 
    // restarted. If testOne returns true, testTwo will not be executed 
    // (which is just as well, as the list has changed under it's feet. 
    reset = testOne() || testTwo(); 
} 
Смежные вопросы