[英]std vector, copying data structure
我有以下课程。
class Row
{
Table* parent_table;
Row(Table* construct);
}
class Table
{
std::vector<Row>;
}
我创建一个std::vector<Table> test;
,然后在一个循环中创建Table对象并将其推回测试向量。 问题是我丢失了每行内的表*。 我需要指针,因此当我遍历行时,我知道它们属于哪个表。
有没有一种方法可以强制std :: vector,而不是在推回对象时不复制对象?
而不是将Row
存储在std::vector
,而存储std::unique_ptr<Row>
或std::shared_ptr<Row>
。 这些往往足以满足此类需求(可以使用更复杂的方法,例如存储原始指针(维护起来很复杂)或滚动自己的基于pImpl
的类,或使用自定义语义编写自己的智能指针)。
unique_ptr
仅支持移动,因此避免了复制问题。 相反, shared_ptr
支持共享所有权,这可能是您不需要的。 我建议使用unique_ptr
。
通过引用或指针推送元素。 您要推送副本,因此复制元素是C ++所能做的。 我个人建议您使用像这样的指针向量: std::vector<Row*>
实际上,一种更安全更干净的方法是存储shared_ptr-s而不是裸指针,这样您就不必过多地处理内存管理。 就像是:
std::vector<std::shared_ptr<Row> >
您在问两个不相关的问题。 请不要在一篇文章中这样做。 一则帖子-一题。 这使回答变得非常容易。
第二:
有没有一种方法可以强制std :: vector,而不是在推回对象时不复制对象?
已经被别人回答了。
第一:
我创建了一个std :: vector测试;然后在一个循环中创建Table对象并将其推回测试向量。 问题是我在表格内的行内丢失了表格*。 我需要指针,因此当我遍历行时,我知道它们属于哪个表。
很可能您的ROW不包含对包含它的表的任何反向引用。 这样,当您遍历行向量或行本身时,您会丢失有关谁拥有它的信息。 您必须沿着传递载体-的-行table* owner
,或一排沿table* owner
,或者你必须使你的行更加智能化,强制所有的行包含一个table* owner
(即,有行包含对所有者的反向引用)
当然,后向引用可以是任何形状 。 它不必是一个指针。 您可以传递Table&
, shared_ptr<Table>
, string tablename
或任何可以帮助您直接或通过某些管理器访问表的内容。 重要的是,该行必须包含它,或者必须与行一起单独传递。
在这种情况下,最简单的解决方案可能是将迭代器存储到表中:
class Row
{
std:vector<Table>::iterator parent_table;
Row(std:vector<Table>::iterator construct);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.