C ++ List Iterator如果列表更改,则重新启动操作

时间:2016-05-15 07:02:00

标签: c++ list hash iterator

我有我的程序迭代的字符列表。当我的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;
     };

2 个答案:

答案 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();
}