我正在用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。两个评论的球杆都正常工作。无论如何,我不知道为什么会这样。我知道我可以通过做一些不同的实现来轻松修复它,但是我想用正确的方式来做。
所以问题是您的仿函数对象正在被复制,而修改正在复制中。这就是为什么似乎完成后会重置的原因。
您可以更改函子以保留对您需要复制的变量的引用。
您可以改用lambda,再次保留对需要修改的变量的引用。
但是对我来说,整个方法太复杂了。只需编写一个for循环。什么都不会复制,一切都是直接的。