c++ - 如何高效、正确地在 vector 中插入对象

标签 c++ reference

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

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

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

最佳答案

I can do it this way -

vector<mynode> nodes;

But if the size of the mynode is large, this would be bad.

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

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

    移动已经构建的对象。

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

关于c++ - 如何高效、正确地在 vector 中插入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895149/

相关文章:

windows - UWP 中的 X509Certificates

c++ - 连接两个 time_t 值的日期和时间

c++ - 如何在不解压缩的情况下创建并附加到 gz 文件?

c++ - 如何在 C++ 中解构二维 vector

c++ - asio::use_future 和事件循环

c++ - 临时延长生命周期

c++ - 表达式 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误

class - 使用类引用进行多态和继承(第2部分)?

c++ - 返回引用后数据被删除

c++ - 蓝牙与电脑交互