C++列表迭代器如果列表更改则重新启动操作
C++ List Iterator Restart actions if List changes
我有一个char列表,我的程序会遍历这些char。当我的for循环检查每个字符时,我应用了许多测试。
我需要做的是,如果其中一个测试更改了列表(即哈希更改),则从头开始重新启动测试。只有完成了所有测试,我的"for"循环才能继续到下一个字符。
做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;
};
您应该使用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++;
}
我会把它写成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();
}
相关文章:
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 重新启动后,线程无法在 while 循环中再次运行
- 在程序和基于文本的游戏和C++内重新启动程序
- 在程序/基于文本的游戏/C++内重新启动程序
- 为什么使用 exec() 重新启动程序不能正常工作?
- 即使在我关闭应用程序并重新启动它后,如何保持我的 ID 被阻止?
- 有没有办法在不重新启动或注销的情况下加载游标?
- IO服务重新启动后,Boost最后期限计时器持续触发
- 在C++中重新启动随机数序列
- 稍后在构造函数中重新启动异常指令删除此指令
- 如何获取代码::块以在代码::块重新启动后保持库的配置?
- 我想在我设置的几秒钟后重新启动我的程序
- 如何使重新启动此循环,当用户输入 1 时,并在 0 时停止
- UDP 服务器每 5 秒重新启动一次
- 有没有办法检查内存缓存是否已重新启动?
- (Windows 10) 在不更新的情况下重新启动C++
- Live555MediaServer 在每个新连接时重新启动流。为什么将"reuseSource"设置为 true 无法按预期工作?
- OpenGL和SFML时钟未正确重新启动
- C++列表迭代器如果列表更改则重新启动操作