gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:09:23 29 4
gpt4 key购买 nike

我编写了一个程序来确定井字游戏的游戏树。我相信大部分代码都井井有条。我编写了一个函数来比较 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com