我做了一个瓷砖匹配的游戏它有一个board对象,该对象保存卡对象的向量并将事件委托给它们。板事件处理包含以下代码:

// Counting logic-driving card states
int cardFaceUpCounter = 0;
std::vector<Card*> faceUpCards(2);

// Checking for logic-driving card states
for (auto& card : this->boardMatrix)
{
    if (this->isCardInAnim(&card))
    {
        return;
    }
    if (this->isCardFaceUp(&card))
    {
        ++cardFaceUpCounter;
        faceUpCards[cardFaceUpCounter - 1] = &card;
    }
}

我刚刚在Kate Gregory上完成了对美丽C++的研究。
她认为我们应该避免编写循环,并且应该尽可能多地使用STL算法头。
我发现她的论点和方法非常有说服力,因此我试图重构我最新的宠物项目,以反映她的教义。
上面的例子就是我不知道如何使用STL算法更好地传达意图并保持性能-单循环而不是两个或三个循环,尽管隐藏在算法调用中。
第二个问题是,如果使用STL算法不能实现单循环效率,那么出于可读性的考虑,您还是更喜欢这种方法。

最佳答案

这是我所想的一个例子。

int cardFaceUpCounter = 0;
std::vector<Card*> faceUpCards(2);

if (std::any_of(boardMatrix.begin(), boardMatrix.end(), [&](auto& card) {
    if (isCardFaceUp(&card))
        faceUpCards[cardFaceUpCounter++] = &card;

    return isCardInAnim(&card);
})) return;

09-11 18:17