C ++无法取消引用结束列表迭代器

时间:2019-12-01 16:07:39

标签: c++ iterator

我正在使用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; 
}

2 个答案:

答案 0 :(得分:0)

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;

答案 1 :(得分:0)

由于output为空,因此出现错误。您可以为此使用back_inserter

std::transform( data1.begin(), data1.end(), data2.begin(), std::back_inserter( output ), std::plus<int>() );

如果您不想使用back_inserter,则必须先调整list的大小。幸运的是,该列表可以使用resize方法和构造函数参数来设置大小。但是,并非所有容器都可以。

以您目前编写的方式,基本上会发生这种情况(非常简化):

iterator start_one = data1.begin();
iterator start_two = data2.begin();
iterator start_three = output.begin();
*start_three = *start_one + *start_two;

由于output为空,output.begin()返回指向end的迭代器,这会导致您看到错误。