У меня есть список символов, который выполняет моя программа. Поскольку мой цикл 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;
};