我是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);
}
答案 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;矢量仍然安全访问这里?
不,是的。
不,至少不是通过名称child
。 child
位于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只能移动传递给它的变量。您的变量是指针,而不是数组。对于原始指针移动与将一个指针复制到另一个指针相同。