假设我想声明一个对象向量。我可以这样做 -
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);
}
这样可以吗?安全?它给出了第一行本身的编译。请建议一些将对象存储在向量中的有效方法。非常感谢。
答案 0 :(得分:3)
不,它不会。无论如何,您需要存储对象。如果您担心复制大型对象,您可以使用一些解决方案:我可以这样做 -
vector<mynode> nodes;
但是如果mynode的大小很大,那就太糟糕了。
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));
移动已构建的对象。
无论如何,一个好的经验法则是为大多数非轻量级对象删除(或私有)复制构造函数/赋值。容器仍然可用(再次提供,您使用的是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)
我不认为指针在这里太糟糕了。它不是无效的东西。在示例中插入引用会保存对位于堆栈上的临时对象的引用,这将超出范围...