标准向量,复制数据结构

时间:2013-03-13 13:50:14

标签: c++ vector

我有以下课程。

class Row
{
   Table* parent_table;
   Row(Table* construct);
}
class Table
{
    std::vector<Row>;
}

我创建了一个std::vector<Table> test;,并在一个循环中创建了Table对象并将它们推回到测试向量中。问题是我在每一行中丢失了表*。我需要指针,所以当我遍历我的行时,我知道它们属于哪个表。

有没有办法强制std :: vector,而不是在被推回时复制对象?

4 个答案:

答案 0 :(得分:4)

不是将Row存储在std::vector中,而是存储std::unique_ptr<Row>std::shared_ptr<Row>。这些对于这种事情来说往往是足够的(有更复杂的方法可以解决这个问题,例如存储原始指针(复杂维护)或滚动自己的基于pImpl的类,或编写自己的智能指针自定义语义)。

unique_ptr仅支持移动,因此可以避免您的复制问题。 shared_ptr代替支持共享所有权,这可能是您不需要的。我建议使用unique_ptr

答案 1 :(得分:1)

通过引用或指针推送元素。您正在推送副本,因此复制元素是C ++可以做的。我个人建议你使用像这样的指针向量:std::vector<Row*>

实际上,一种更安全,更清晰的方法是存储shared_ptr-s而不是裸指针,这样你就不必那么多地处理内存管理了。类似的东西:

std::vector<std::shared_ptr<Row> >

答案 2 :(得分:1)

你问两个不相关的问题。请不要在一个帖子中这样做。一个帖子 - 一个问题。这使得回答变得更加容易。

第二:

  

有没有办法强制的std ::向量,不要复制的对象时,他们推回?

其他人已经回答了。

FIRST:

  

我创建的std ::向量测试,和在一个循环中创建表的对象和把它们放回至测试向量。问题是我在Table里面的Row里面输了Table *。我需要的指针,所以当我通过我行迭代,我知道他们属于哪个表。

很可能你的ROW不包含对包含它的表的任何反向引用。这样,当您传递行向量或行本身时,您将丢失有关谁拥有它的信息。您必须将行向量与table* owner一起传递,或者将行与table* owner一起传递,或者您必须使您的行更智能并强制所有行包含table* owner (也就是说,让行包含对所有者的反向引用)

当然,后向引用可能是任何形状。它不需要是指针。您可以直接或通过某位经理传递Table&shared_ptr<Table>string tablename或任何有助于您访问该表格的内容。重要的是,Row必须包含它,或者它必须单独传递,但与行一起传递。

答案 3 :(得分:0)

在这种情况下,最简单的解决方案可能是将迭代器存储到您的表中:

class Row
{
    std:vector<Table>::iterator parent_table;
    Row(std:vector<Table>::iterator construct);
}