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