Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在向向量添加元素时,如何知道要创建对象的副本?_C++_Object_Reference_Stdvector - Fatal编程技术网

C++ 在向向量添加元素时,如何知道要创建对象的副本?

C++ 在向向量添加元素时,如何知道要创建对象的副本?,c++,object,reference,stdvector,C++,Object,Reference,Stdvector,我的类中有一个名为LastQueryInfo lastQuery的对象。每次该对象发生更改时,我都将其添加到一个名为history的向量中 最初,当我执行history.push_back(lastQuery)时,我不知道会发生什么-向量会复制对象吗?还是要保留对它的引用?因此,如果稍后我修改lastQuery,历史向量中的所有对象(假设它们是引用)都将被修改吗 经过一些测试,我发现history.push_back(lastQuery)确实要复制对象,然后将其添加到向量中。但是如果不做任何测试

我的类中有一个名为
LastQueryInfo lastQuery
的对象。每次该对象发生更改时,我都将其添加到一个名为
history
的向量中

最初,当我执行
history.push_back(lastQuery)
时,我不知道会发生什么-向量会复制对象吗?还是要保留对它的引用?因此,如果稍后我修改lastQuery,历史向量中的所有对象(假设它们是引用)都将被修改吗


经过一些测试,我发现
history.push_back(lastQuery)
确实要复制对象,然后将其添加到向量中。但是如果不做任何测试,我怎么知道呢?我怎么知道C++何时会复制,当它要添加实际对象时?

< P> <代码>:STD::vector < /COD> <强>始终< /强>存储任何你的代码> PurthBoD()/<代码>。因此,修改传入的值不会影响存储在向量中的值。它不像Java或C#中的
对象o
实际上是对该对象的引用,并且该对象一直存在,直到垃圾收集器到来并在对它的最后一次引用消失时拾取它为止。在C++中,<代码>对象O;
是实际对象,它将在其作用域结束时消失

因此,如果
std::vector
只存储对您
push_back()
的对象的引用,那么它将完全没有用:

std::vector<int> numbers;
for(/* loop condition */) {
    int number = GetUserInput();
    numbers.push_back(n);
}
std::向量数;
对于(/*循环条件*/){
int number=GetUserInput();
数字。推回(n);
}
由于
number
将在循环结束时消失,
numbers
将保留对某些内容的引用,如果
std::vector
仅通过存储引用来实现,则这些内容将不存在。如果
std::vector
实际存储了这些值,则即使在循环之后也可以访问它们


†C++11支持,因此,如果您要推回的对象实际上是一个很快就会消失的临时对象,它会将对象的内部内容移动到向量存储中,而不是复制。您还可以显式使用C++11的
std::move()
push_back()
期间“强制”移动。但vector会在其他情况下复制该值。这是一个优化向量性能的实现细节。

std::vector
始终存储一份†您所推送的内容的副本()。因此,修改传入的值不会影响存储在向量中的值。它不像Java或C#中的
对象o
实际上是对该对象的引用,并且该对象一直存在,直到垃圾收集器到来并在对它的最后一次引用消失时拾取它为止。在C++中,<代码>对象O;
是实际对象,它将在其作用域结束时消失

因此,如果
std::vector
只存储对您
push_back()
的对象的引用,那么它将完全没有用:

std::vector<int> numbers;
for(/* loop condition */) {
    int number = GetUserInput();
    numbers.push_back(n);
}
std::向量数;
对于(/*循环条件*/){
int number=GetUserInput();
数字。推回(n);
}
由于
number
将在循环结束时消失,
numbers
将保留对某些内容的引用,如果
std::vector
仅通过存储引用来实现,则这些内容将不存在。如果
std::vector
实际存储了这些值,则即使在循环之后也可以访问它们


†C++11支持,因此,如果您要推回的对象实际上是一个很快就会消失的临时对象,它会将对象的内部内容移动到向量存储中,而不是复制。您还可以显式使用C++11的
std::move()
push_back()
期间“强制”移动。但vector会在其他情况下复制该值。这是一个优化向量性能的实现细节。

使用
push\u back
将始终创建所存储对象的副本

如果您使用的是c++11,那么有两种方法可以避免复制:

  • 使用该方法
  • 将创建的对象移动到向量中:
    vec.push_back(std::move(obj))

如果您没有使用c++11,那么您唯一能做的就是使用指针或
boost::shared_ptr
作为向量类型。

使用
push_back
将始终创建所存储对象的副本

如果您使用的是c++11,那么有两种方法可以避免复制:

  • 使用该方法
  • 将创建的对象移动到向量中:
    vec.push_back(std::move(obj))
如果您没有使用c++11,那么您唯一能做的就是使用指针或
boost::shared_ptr
作为向量类型