C ++ vector:push_back一个int =>的数组数组是否被复制?

时间:2016-10-20 14:07:04

标签: c++ arrays vector dynamic-memory-allocation

我是C ++对象生命的新手,所以请耐心等待。

我有一个动态分配的整数数组向量:std::vector<int*>

This page说“将val的内容复制(或移动)到新元素。”

我从中理解的是,我可以移动或复制插入数组的内容,但是何时移动它以及何时复制它?

我怀疑如果它是原始类型的话会复制值?例如,int,char等?

否则会被复制?这是否意味着我的阵列会被“移动”?

===================

编辑1 :我想要找出的是假设我将向量传递给函数。在这个函数中,我分配一个整数数组并将其推入向量。一旦函数返回并且我回到调用者,我是否仍然可以安全地访问刚推入向量的数组?

编辑2 :有人建议使用vector<vector<int>>,所以我的问题变成了,如果我将“父”向量传递给某个函数。在这个函数中,我创建了内部向量并将其推入外部向量。当我回到调用者时,我是否仍然可以安全地访问刚刚推入外部向量的新内部向量? 像这样:

void foo()
{
    vector<vector<int>> parentV;
    addVect(parentV);

    //Is is safe to access parentV[0][0] here?
}


void addVect(vector<vector<int>> &parentV)
{
    vector<int> child;
    child.push_back(1);
    child.push_back(2);
    parentV.push_back(child);
}

3 个答案:

答案 0 :(得分:1)

存储在向量中的指针可能会移动,但它指向的地址不会移动,这意味着您的数据永远不会移动。如果你在向量中有实际的int,然后将一个地址带到其中一个,那么如果必须重新分配向量,那么该指针可能会失效,但由于只有指针存储在向量中,所以你的实际内容在数组永远不会被重新定位。

答案 1 :(得分:1)

  

一些建议使用vector&gt;,所以我的问题变成了,如果我   通过&#34;父母&#34;矢量到一些功能。在这个功能中,我   创建内部向量并将其推入外部向量。我什么时候   回到调用者,我还能安全地访问新的内部向量   刚被推入外部载体?

void foo()
{
    vector<vector<int>> parentV;
    addVect(parentV);

    //Is the "child" vector still safe for access here?
}


void addVect(vector<vector<int>> &parentV)
{
    vector<int> child;
    child.push_back(1);
    child.push_back(2);
    parentV.push_back(child);
}

回答:

  

&#34;孩子&#34;矢量仍然安全访问这里?

不,是的。

不,至少不是通过名称childchild位于addVect的本地,因此foo对此一无所知。在addVect返回后它将被销毁。

是的,您可以通过parentV访问它的价值,因为它们已被复制到parentV并且您正在通过{{ 1}}作为参考。

parentV

auto copyOfChild = *parentV.rbegin(); //get the last vector since push_back adds to the end of the vector

答案 2 :(得分:0)

  

但什么时候移动以及何时被复制?

它基于您传递的值类型。例如,std::vvector::push_back()有2 overrides:

void push_back( const T& value );   
void push_back( T&& value );

因此,如果传递一个可以绑定到rvalue refence的类型,则调用第二个方法并移动对象。否则调用第一个方法并复制对象。

  

我怀疑如果它是原始类型的话会复制值?例如,int,char等?

不是它基于值类型,而不是基于类型原语等。 例如:

 std::vector<Foobar> vec;
 Foobar f;
 vec.push_back( Foobar() ); // temporary binds to rvalue, move
 vec.push_back( f ); // value copied
 vec.push_back( std::move( f ) ); // now f moved
  

这是否意味着我的阵列会被“移动”?

不能移动您的阵列。 Vector只能移动传递给它的变量。您的变量是指针,而不是数组。对于原始指针移动与将一个指针复制到另一个指针相同。