我正在使用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;
}
答案 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
的迭代器,这会导致您看到错误。