繁体   English   中英

std向量,复制数据结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM