C++列表迭代器如果列表更改则重新启动操作

C++ List Iterator Restart actions if List changes

本文关键字:列表 重新启动 操作 迭代器 如果 C++      更新时间:2023-10-16

我有一个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();
}