c++ - 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 都正常工作。反正我不知道为什么会这样。我知道我可以通过做一些不同的实现来轻松修复它,但我想以正确的方式去做。
解决方案
改变
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 将它们包装起来,因此它们不会被复制。
推荐阅读
- c# - 我应该如何从 C# 中存储过程的选择查询中获取值
- c# - 如何解决 API 中的“底层连接已关闭”
- python - Python 获取 Instagram 帖子的所有图片
- azure - 如何在具有基本身份验证的应用程序前设置 Azure SSO/MFA?
- python - 列表中的列表更改但列表中的 var 没有?
- sql - 如何将不同日期的重复条目计为单个条目?
- javascript - Javascript。如何创建一个创建对象的循环,然后将这些对象推入数组?
- javascript - 使用 JavaScript 将数据插入数据库时,控制台中会创建错误“超出最大调用堆栈大小”
- javascript - 如何在反应中将句柄更改添加到待办事项应用程序?
- javascript - 无法在模板文字中调用函数