C++ std向量,复制数据结构

C++ std向量,复制数据结构,c++,vector,C++,Vector,我有以下课程 class Row { Table* parent_table; Row(Table* construct); } class Table { std::vector<Row>; } 类行 { 表*父表; 行(表*构造); } 类表 { std::vector; } 我创建了一个std::vector测试,然后在循环中创建表对象并将它们推回测试向量。问题是我丢失了每行中的表*。我需要指针,这样当我遍历我的行时,我就知道它们属于哪个表 有没有办法强

我有以下课程

class Row
{
   Table* parent_table;
   Row(Table* construct);
}
class Table
{
    std::vector<Row>;
}
类行
{
表*父表;
行(表*构造);
}
类表
{
std::vector;
}

我创建了一个
std::vector测试,然后在循环中创建表对象并将它们推回测试向量。问题是我丢失了每行中的表*。我需要指针,这样当我遍历我的行时,我就知道它们属于哪个表


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

通过引用或指针推送元素。你正在推动拷贝,所以复制元素是C++所能做的。我个人建议您使用如下指针向量:
std::vector

实际上,一种更安全、更干净的方法是存储共享的_ptr-s,而不是裸指针,这样就不必太多地处理内存管理。比如:


std::vector
通过引用或指针推送元素。你正在推动拷贝,所以复制元素是C++所能做的。我个人建议您使用如下指针向量:
std::vector

实际上,一种更安全、更干净的方法是存储共享的_ptr-s,而不是裸指针,这样就不必太多地处理内存管理。比如:


std::vector

std::vector
中存储
std::unique\u ptr
std::shared\u ptr
而不是存储
Row
。对于这类事情,这些就足够了(有更复杂的方法可以实现这一点,比如存储原始指针(维护起来很复杂),或者滚动您自己的基于
pImpl
的类,或者使用自定义语义编写您自己的智能指针)


unique\u ptr
仅支持移动,因此可以避免复制问题<代码>共享\u ptr
支持共享所有权,这可能是您不需要的。我建议使用
unique\u ptr
而不是将
存储在
std::vector
中,存储
std::unique\u ptr
std::shared\u ptr
。对于这类事情,这些就足够了(有更复杂的方法可以实现这一点,比如存储原始指针(维护起来很复杂),或者滚动您自己的基于
pImpl
的类,或者使用自定义语义编写您自己的智能指针)


unique\u ptr
仅支持移动,因此可以避免复制问题<代码>共享\u ptr支持共享所有权,这可能是您不需要的。我建议使用
unique\u ptr

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

class Row
{
    std:vector<Table>::iterator parent_table;
    Row(std:vector<Table>::iterator construct);
}
类行
{
std:vector::迭代器父表;
行(std:vector::迭代器构造);
}

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

class Row
{
    std:vector<Table>::iterator parent_table;
    Row(std:vector<Table>::iterator construct);
}
类行
{
std:vector::迭代器父表;
行(std:vector::迭代器构造);
}

您正在问两个无关的问题。请不要在一个帖子里这样做。一个帖子一个问题。这样回答起来就容易多了

第二:

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

其他人已经回答了这个问题

第一:


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

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


当然,反向参考可以是任何形状的。它不需要是指针。您可以传递
表格&
、一个
共享\u ptr
、一个
字符串tablename
或任何有助于您直接或通过某个管理器访问表格的内容。重要的是,行必须包含它,或者它必须单独传递,但与行一起传递。

您正在问两个无关的问题。请不要在一个帖子里这样做。一个帖子一个问题。这样回答起来就容易多了

第二:

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

其他人已经回答了这个问题

第一:


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

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

当然,反向参考可以是任何形状的。它不需要是指针。您可以传递
表格&
、一个
共享\u ptr
、一个
字符串tablename
或任何有助于您直接或通过某个管理器访问表格的内容。重要的是,行必须包含它,或者它必须与行一起单独传递。

std::vector::iterator