假设我想声明一个对象 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.
不,不会。无论如何,您都需要存储对象。如果您担心复制 大对象,您有一些解决方案:
- 使用
std::vector<std::unique_ptr<my_node>>
(或另一个智能指针),它会在销毁时自动释放对象。这是最好的解决方案,如果my_node
是多态的。 - 使用
std::vector<my_node>
并使用emplace_back
就地构造对象的函数(请注意,如果您使用的是 visual studio 2010,此函数不会执行它应该执行的操作)。 仍然使用
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/