我正在玩为 C++ 提出的 2d 图形库,这是我从这里 https://github.com/cristianadam/io2d 获得的旧实现,我正在尝试在我加载到向量中的显示表面上渲染图像表面使用 std::copy 算法的无符号字符
auto loadimg(std::ifstream &file) {
std::vector<unsigned char> img_data{};
std::copy(std::istream_iterator<unsigned char>(file) ,
std::istream_iterator<unsigned char>(), img_data.begin());
return img_data;
}
我也试过 std::move
。
loadimg 功能的客户端是这样的
std::ifstream file("packagelevel.png");
img_surf.data(loadimg(file));
虽然程序使用 Visual Studio 2017 编译。但我在调试时收到错误“无法取消引用值初始化迭代器”,并且在 loadimg 返回语句中引发了异常。我做错了什么?
原文由 Ogunleye Ayowale Pius 发布,翻译遵循 CC BY-SA 4.0 许可协议
您在调用
std::copy()
时提供了一个空的std::vector
作为目标,因此它可能太小而无法容纳源数据,因此您会得到 undefined behavior 。要直接解决此问题,您需要将std::back_inserter
作为第三个参数传递给std::copy()
。这样,它会在复制到std::vector
时附加到它,从而确保它具有正确的大小 - 如 底部 示例所示。话虽如此,如果您只想将文件的内容复制到
std::vector
中,那么这将是一种常用且被广泛推荐的模式,在 这里 使用第 4 个重载:这是很好的形式,因为给构造函数的第一个参数(类型为
std::istreambuf_iterator
) 满足LegacyInputIterator
。第二个参数是默认构造的std::istreambuf_iterator
,它可以方便地用作该流或任何此类流的end
迭代器。