2011-12-17 137 views
9

可以说我有一个动态分配的对象。 如果我将它推入STL向量,将引用插入向量或此对象的副本?std :: vector插入对象的副本或引用?

这是一个普遍的问题。例如:

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,也会反对死亡?

+1

请显示您正在考虑的代码:-) – 2011-12-17 14:18:22

+4

我的说教方面出来了,我觉得我必须告诉你,你很可能不是指STL而是C++标准库。 – Corbin 2011-12-17 14:20:19

+1

C++标准库已经为其容器和算法采用了STL。所以,从技术上讲,STL向量与C++库向量相同。 – 2011-12-17 14:23:24

回答

8

将引用插入向量或此对象的副本?

复制(这意味着你的class应该是复制能力,否则编译器错误)。

说明性:不能在std::vector<>中指定参考文献。此外,这里的对象具有更广泛的意义,它可以是一个正常的变量或指针,但std::vector<>只接受副本。

更新:Post C++ 11,大部分标准容器都使用“右值API方法”提供对象std::move();在那里可能不会执行副本。

+0

我很惊讶,我认为编译器会在某些情况下优化复制操作,但发现它没有:http://ideone.com/b4fpc即使使用g ++ -O6 – matiu 2011-12-17 14:40:04

+0

这一个演示了如何昂贵复制操作可以通过复制一个131 KB的对象:http://ideone.com/UNKyr – matiu 2011-12-17 14:58:16

2

你检查过reference

void push_back (const T& x); 

添加元素在向量的末尾添加一个新元素,其目前的最后一个元素之后。 这个新元素的内容被初始化为x的副本。

这有效地将矢量大小增加1,如果矢量大小等于调用前的矢量容量,则会导致内部分配存储的重新分配。重新分配无效所有以前获得的迭代器,引用和指针

7

如果您已经动态分配T类型的对象,你推指向对象std::vector<T*>,然后将鼠标指针的副本是推。如果取消引用指针并将结果推送到std::vector<T>,则会创建该对象的副本。收藏集始终进行复制。因此,指针集合使指针的副本和类实例的集合本身(使用拷贝构造IIRC)复制实例本身。

相关问题