首页 > 解决方案 > C++ 不能取消引用结束列表迭代器

问题描述

我正在使用 transform 和 plus() 来合并 2 个列表,它会引发无法取消引用结束列表迭代器的错误。有人可以帮忙吗?谢谢

    list<int> add(const list<int> & data1, const list<int> & data2) noexcept {
    list<int> output;
    if (data1.size() == data2.size())
    {
        transform(data1.begin(), data1.end(), data2.begin(), output.begin(),plus<int>());
        return output;
    }
    return output; 
}

标签: c++iterator

解决方案


transform 不会创建新元素,它只是写入您给它的第四个迭代器。因此,您需要先调整列表的大小:

list<int> add(const list<int> & data1, const list<int> & data2) noexcept {
    list<int> output(data1.size());
    if (data1.size() == data2.size())
    {
        transform(data1.begin(), data1.end(), data2.begin(), output.begin(),plus<int>());
        return output;
    }
    return output; 
}

或者使用一个后插入迭代器,它会在你的列表中为每个元素自动调用“push_back”:

list<int> add(const list<int> & data1, const list<int> & data2) noexcept {
    list<int> output;
    if (data1.size() == data2.size())
    {
        transform(data1.begin(), data1.end(), data2.begin(), std::back_inserter(output),plus<int>());
        return output;
    }
    return output; 
}

令人困惑的错误可能是由于对于一个空列表begin() == end(),因此 transform 正在有效地尝试执行以下操作:

*output.end() = result;

推荐阅读