无法取消引用值初始化的迭代器

新手上路,请多包涵

我正在玩为 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 许可协议

阅读 1.1k
1 个回答

您在调用 std::copy() 时提供了一个空的 std::vector 作为目标,因此它可能太小而无法容纳源数据,因此您会得到 undefined behavior 。要直接解决此问题,您需要将 std::back_inserter 作为第三个参数传递给 std::copy() 。这样,它会在复制到 std::vector 时附加到它,从而确保它具有正确的大小 - 如 底部 示例所示。

话虽如此,如果您只想将文件的内容复制到 std::vector 中,那么这将是一种常用且被广泛推荐的模式,在 这里 使用第 4 个重载:

 auto loadimg(std::ifstream &file) {
    std::vector<unsigned char> img_data(
        std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
    return img_data;
}

这是很好的形式,因为给构造函数的第一个参数(类型为 std::istreambuf_iterator满足 LegacyInputIterator 。第二个参数是默认构造的 std::istreambuf_iterator ,它可以方便地用作该流或任何此类流的 end 迭代器。

原文由 Geezer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题