gpt4 book ai didi

c++ - 不能取消引用值初始化的迭代器

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:29 25 4
gpt4 key购买 nike

我正在研究提议的 C++ 二维图形库,这是我从这里获得的旧实现 https://github.com/cristianadam/io2d ,我正在尝试在显示表面上渲染图像表面,我使用 std::copy 算法将其加载到 unsigned char 的 vector 中

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 return 语句中抛出异常。我做错了什么?

最佳答案

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

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

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 类型)satisfies 的格式正确LegacyInputIterator .第二个参数是默认构造的 std::istreambuf_iterator,它可以方便地用作此流或任何此类流的 end 迭代器。

关于c++ - 不能取消引用值初始化的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52150939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com