vector插入对象的副本或引用
std::vector inserts a copy or reference of an object?
假设我有一个动态分配的对象。如果我将它推入STL向量,将引用插入到向量或该对象的副本中吗?
这是一个一般性的问题。例如:
class vec {
vector<obj> vec;
void addToVec(obj a) {
// insert a into vec
}
...
...
...
}
obj* a = new obj;
vec* v = new vec;
vec.addToVec(a);
如果我删除v,对象a也会死吗?
是将引用插入vector对象还是该对象的副本?
Copy(这意味着你的class
应该是可复制的,否则编译错误)。
说明: std::vector<>
中不能分配参考文献。另外,这里的对象有更广泛的意义,它可以是一个普通的变量,也可以是一个指针,但是std::vector<>
只接受拷贝。
更新:在c++ 11之后,大多数标准容器使用"基于右值的API方法"提供了对象的std::move()
;不得复制的
如果您有一个动态分配的T
类型的对象,并且您将指向该对象的指针压入std::vector<T*>
,那么该指针的副本将被压入。如果对指针解引用并将结果压入std::vector<T>
,则生成该对象的副本。集合总是会生成副本。因此,指针的集合复制指针,类实例的集合复制实例本身(使用复制构造IIRC)。
您是否检查了参考:
void push_back ( const T& x );
在末尾添加元素
在vector对象的最后一个元素之后,在vector对象的末尾添加一个新元素。新元素的内容初始化为x的副本。
这有效地将vector的大小增加1,如果vector的大小等于调用前的vector容量,则会导致内部分配的存储空间重新分配。重新分配会使先前获得的所有迭代器、引用和指针失效
相关文章:
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 标准库容器结构是否存储副本或引用?
- 如何声明接受转发引用并返回引用或副本的函数模板
- 如何在我的源代码中找到所有发生的情况,其中std :: string被传递给方法作为副本而不是恒定引用
- 取消引用指针以创建数组的副本
- 返回不带副本 ctor 的引用
- 为什么在C 11中推荐的值(如果需要副本),如果const引用也只花费单个副本,则建议通过值(如果需要副本)
- 如何通过制作副本从函数返回引用
- 可以在同一函数中引用副本本地变量是否可以
- 为什么从三元文字中绑定到const引用副本
- 传递常量引用与创建临时常量副本相同,那么为什么要传递常量引用
- 为什么在 constexpr 函数中允许返回对常量指针的引用,但不返回副本
- 初始化引用时何时以及为何获得副本
- 处理对“vector_binary_operation”类中“表达式”的引用,而无需不必要的副本
- 按方法返回副本或引用
- 您能否从抽象引用创建具体对象的副本
- 常量引用和创建副本
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员