c++ - 正确迭代 vector 的建议

标签 c++ vector iterator

我编写了一个程序来确定井字游戏的游戏树。 我相信大部分代码都井井有条。 我编写了一个函数来比较 vector 的元素以确定是否有任何元素重复。 重复项可以完全相同,也可以对称。 从 vector 中删除重复元素。 我的比较函数似乎有一个问题,它错误地消除了元素。 请看一下我是如何遍历 vector 的,看看语法/逻辑是否合理。

我的猜测是使用 < > 运算符可能是问题的一部分。 该函数的基本逻辑是比较第一个元素和最后一个元素,然后是倒数第二个元素,依此类推。将第一个元素与所有元素进行比较后,您再次开始将第二个元素与其他元素进行比较,依此类推...

void compareAllGames(move& aMove) { /* aMove is a vector of games. games are a struct of data */
    vector<game>:: iterator frontIter = aMove.begin();
    vector<game>:: iterator rearIter = aMove.end() - 1;
    vector<game>:: iterator compIter;
    for (; frontIter < rearIter; frontIter++) { /* move along the games from first to last */
        for (compIter = aMove.end(); compIter > frontIter; ) { /* move along the games from last to first */
            /* checkForSymmetry compares *frontIter to all symmetries of *compIter */
            if (checkForSymmetry(*frontIter, *compIter)) {
                compIter--;
                aMove.erase(compIter + 1);
            }
            else {
                compIter--;
            }
        } /* reset iterators for next loop */
        compIter = aMove.end();
        rearIter = aMove.end();
    }
}

最佳答案

看起来至少有一个或两个地方可以访问 end,它已经超出了容器的末尾。与其尝试修复有些复杂的逻辑,不如建议以下方法之一:

如果您可以创建一个始终相邻排列对称解决方案的排序,您可以应用该顺序,然后使用带有谓词的 std::unique 来删除重复项。

如果你不能那样做,那么使用 remove_if 而不是你复杂的内部循环:

void compareAllGames(move& aMove) { /* aMove is a vector of games. games are a struct of data */
    vector<game>:: iterator frontIter = aMove.begin();
    for (; frontIter < aMove.end() - 1; frontIter++) { /* move along the games from first to last */
        aMove.erase(std::remove_if(frontIter + 1, aMove.end(), std::bind1st(checkForSymmetry, *frontIter)), aMove.end());
    }
}

关于c++ - 正确迭代 vector 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5561301/

相关文章:

c++ - 当存在修饰符(L、u8 等)时,相邻字符串文字连接会发生什么情况?

math - 如何降低向量的维数

c++ - boost::range::join 一个自定义调用中的多个范围

c++ - find_if 找到一个不等于某物的元素

java - modCount何时在java.util.ArrayList中初始化?

c++ - 在割炬C++中创建BoolTensor蒙版

C++:有符号 64 位整数中两个无符号 64 位整数的差

c++ - UBUNTU C++ 编译器找不到头文件

C++:检查 vector<Class> 是否是 vector<Class> 的子集

Java 将数组增加 X 大小