为什么这里不允许将矢量附加到另一个矢量?

Dan*_*iel 3 c++ vector

我使用方法(c ++)将向量追加到另一个向量:

a.insert(a.end(), b.begin(), b.end());
Run Code Online (Sandbox Code Playgroud)

它可以工作,但如果b从成员函数获得,那么它将不再起作用,比如说

vector<point> const line::returnAVectorOfPoints() const
{
    vector<point> pts;
    // Do something
    return pts;
}
Run Code Online (Sandbox Code Playgroud)

然后这次,当我尝试(像这样)

a.insert(a.end(), returnAVectorOfPoints().begin(), returnAVectorOfPoints().end());
Run Code Online (Sandbox Code Playgroud)

我有一个segv.任何想法在这里出了什么问题?

jua*_*nza 7

您将按值返回向量line::returnAVectorOfPoints(),因此这两个迭代器不兼容:

returnAVectorOfPoints().begin(), returnAVectorOfPoints().end()
Run Code Online (Sandbox Code Playgroud)

它们指向两个不同的临时对象.

您可以将返回值存储在临时变量中:

auto v = returnAVectorOfPoints();
a.insert(a.end(), v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

另外,请注意您不应该返回const值.它抑制了移动语义,这可能非常昂贵.