gpt4 book ai didi

c++ - 为什么使用 std::transform 会导致 exc_bad_access

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:09 25 4
gpt4 key购买 nike

我在 cpp 应用程序中(大致)有这段代码:

QList<Foo> rawAssets = getlist();
QVector<std::pair<QString, QString>> assets;
std::transform(rawAssets.begin(), rawAssets.end(), assets.begin(), makePair);

当我再次使用 assets 时,这会导致 exc_bad_access 抛出。

但是,如果我将 assets.begin() 更改为 std::back_inserter(assets),那么它会按预期工作。

我找到了显示这两种用法的 std::transform 教程。为什么我的情况不对?

最佳答案

由于您刚刚声明了 QVector<std::pair<QString, QString>> assets ;它是空的。 assets.begin()因此等于 assets.end() , 并指向空 vector 的末尾。

std::transform的第三个参数是一个迭代器,通过它 transform写入转换的结果(并在每次写入后增加它)。

当你传入 assets.begin() 时, transform将通过这个尾后迭代器进行写入,从而导致越界写入。这与执行 char x[3]; x[4] = 'a'; 大致相同

当你传入 std::back_inserter(assets) 时,您创建了一个特殊的迭代器,这样通过它写入实际上插入写入的元素到 assets 中.所以一切都很好。

如果 assets 则可以使用第一种形式已经足够大,您想要覆盖其中的元素。第二种形式用于扩展 assets与转换的结果。

关于c++ - 为什么使用 std::transform 会导致 exc_bad_access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42887034/

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