首页 > 解决方案 > std::for_each 似乎正在清理 std::string

问题描述

我正在使用 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。两个评论的 couts 都正常工作。反正我不知道为什么会这样。我知道我可以通过做一些不同的实现来轻松修复它,但我想以正确的方式去做。

标签: c++stringoopforeachstl

解决方案


改变

std::for_each(v_board.begin(), v_board.end(), boardToString);

std::for_each(v_board.begin(), v_board.end(), std::ref(boardToString));

传递给 std 算法的函数对象被复制;std ref 将它们包装起来,因此它们不会被复制。


推荐阅读