如何高效,正确地在矢量中插入对象

时间:2012-03-27 18:11:52

标签: c++ reference

假设我想声明一个对象向量。我可以这样做 -

vector<mynode> nodes;

但是如果mynode的大小很大,那就太糟糕了。所以我想这样做 -

vector<mynode*> nodes;

但是上述声明有一个明显的问题,即我存储地址并且它根本不安全。例如,如果我在foor循环中添加对象 -

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);
}

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

3 个答案:

答案 0 :(得分: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>并使用带有右值引用的push_back,如

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

    移动已构建的对象。

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

我不认为指针在这里太糟糕了。它不是无效的东西。在示例中插入引用会保存对位于堆栈上的临时对象的引用,这将超出范围...