std :: for_each似乎正在清理std :: string

问题描述 投票:0回答:1

我正在用STL在c ++ 17中制作一个简单的蛇游戏,并且我在将板子(std :: vector)解析为std :: string时遇到了问题。我在自定义仿函数中使用std :: for_each。这是解析方法:

std::string Board::parseBoardToString()
{
    boardToString.resetStringBoard();
    std::for_each(v_board.begin(), v_board.end(), boardToString);
    return boardToString.getStringBoard();
}

Functor原型(其中一些方法用于测试,没关系):

class BoardToString
{
    public:
        BoardToString(unsigned _width);
        void operator()(char _cell);
        void resetStringBoard();
        std::string getStringBoard();
        void printStringBoard();
    private:
        bool isItLastLine();
        void resetCharsToNewLine();
        std::string stringBoard;
        const unsigned U_WIDTH;
        unsigned charsToNewLine;
};

和operator()实现:

void BoardToString::operator()(char _cell)
{
    stringBoard.push_back(_cell);
    //std::cout << _cell;
    //std::cout << stringBoard.back();
    if (isItLastLine())
    {
        stringBoard.push_back('\n');
        //std::cout << stringBoard.back();
        //std::cout << '\n';
        resetCharsToNewLine();
    }
}

[经过一些测试,我很确定在for_each结束工作时,stringBoard将被清除。当for_each工作时,GDB会正确显示字符串大小,然后显示0。两个评论的球杆都正常工作。无论如何,我不知道为什么会这样。我知道我可以通过做一些不同的实现来轻松修复它,但是我想用正确的方式来做。

c++ string oop foreach stl
1个回答
0
投票

所以问题是您的仿函数对象正在被复制,而修改正在复制中。这就是为什么似乎完成后会重置的原因。

您可以更改函子以保留对您需要复制的变量的引用。

您可以改用lambda,再次保留对需要修改的变量的引用。

但是对我来说,整个方法太复杂了。只需编写一个for循环。什么都不会复制,一切都是直接的。

© www.soinside.com 2019 - 2024. All rights reserved.