2012-03-27 107 views
0

假设我想声明一个对象向量。我可以这样做 -如何高效,正确地在对象中插入对象

vector<mynode> nodes; 

但是,如果mynode的大小很大,这将是不好的。所以我想这样做 -

vector<mynode*> nodes; 

但上述声明有一个明显的问题,我存储的地址,它根本不安全。举例来说,如果我在福尔循环添加对象 -

vector<mynode*> nodes; 
for (int i=0; i<10; i++) 
{ 
    mynode mn; 
    nodes.push_back(&mn); 
} 

这将导致错误,因为我不能保证如果指针的内容实际上是确定。

所以,我决定使用此声明 -

vector<mynode&> nodes; 
for (int i=0; i<10; i++) 
{ 
    mynode mn; 
    nodes.push_back(mn); 
} 

是这样行吗?安全?它提供了第一行本身的汇编。请建议一些将对象存储在向量中的有效方法。非常感谢。

+1

不,存储引用和存储指针一样糟糕。如果频繁插入并且会减慢程序速度,请考虑使用另一个数据结构('deque'?)或'std :: vector >'。另外:您的问题名称与问题本身不符。 – 2012-03-27 18:14:26

+3

不要担心优化矢量,除非您的剖析显示它是一个实际问题。第一种形式'矢量'是最好的。 – 2012-03-27 18:15:53

+0

@MooingDuck,存储引用是不可能的,因为引用不能被重新分配。 – 2012-03-27 18:16:32

回答

3

我能做到这样 -

vector<mynode> nodes; 

但如果MYNODE的尺寸较大,这将是糟糕的。

不,它不会。无论如何你需要存储对象。如果你担心复制大对象,你有一些解决方案:

  1. 使用std::vector<std::unique_ptr<my_node>>(或其它智能指针),它在破坏自动释放的对象。如果my_node是多态的,这是最好的解决方案。
  2. 使用std::vector<my_node>并使用emplace_back函数来构建对象(注意,如果您使用的是Visual Studio 2010,则该函数不会执行它应该执行的操作)。
  3. 还在用std::vector<my_node>

    v.push_back(std::move(some_node));

    使用push_back与右值引用,以移动已构造的对象。

无论如何,一个好的经验法则是将复制构造函数/赋值删除(或私有)为大多数非轻量级对象。容器仍然是功能性的(再次提供您使用C++ 11),您的担忧是没有意义的。

+0

在以下位置添加缺少的空格:std :: vector > – stanwise 2012-03-27 18:32:19

+1

@stanwise:不适用于C++ 11。 – 2012-03-27 18:55:08

+0

错过了更新,谢谢你让我知道。 – stanwise 2012-03-27 20:35:26

0

我没有看到指针在这里很糟糕。这不是无效或什么。在你的例子中插入引用保存对位于堆栈上的临时对象的引用,这将会超出范围...

+0

在这里使用原始指针*是*不好,因为它不是异常安全的(C++的难度主要来自异常安全性问题):如果在没有对象被释放的情况下异常传播到上游,则内存泄漏。 – 2012-03-27 18:25:31

1

使用引用给出的基本上与使用指针相同(这只是你不需要在代码中解引用它们)。 如果您想自动确保插入到矢量的对象不会被删除而不复制它们,您应该使用来自boost或C++ 11的智能指针。

vector< smart_ptr<mynode> > nodes; 
for (int i=0; i<10; i++) 
{ 
    smart_ptr<mynode> mn = new mynode(); 
    nodes.push_back(mn); 
} 
+0

要创建一个有10个节点的矢量,那么'std :: vector 节点(10);' – 2012-03-27 18:28:43

+0

@BoPersson - 当然,但我只是想在OP提供的同一个案例中显示使用示例。 – stanwise 2012-03-27 18:30:52

相关问题