我有我的程序迭代的字符列表。当我的for循环检查每个字符时,我会应用一些测试。
我需要做的是,如果其中一个测试更改了列表(即Hash已更改),请从头开始重新启动测试。只有完成所有测试后我才能完成测试。循环继续下一个字符。
do-while循环可能有效,但我遇到了麻烦。
在示例中,结果应该是" 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 :(得分:0)
你应该使用类似这样的while循环
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++;
}
答案 1 :(得分:0)
我会把它写成for循环:
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();
}