首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >标准向量,复制数据结构

标准向量,复制数据结构
EN

Stack Overflow用户
提问于 2013-03-13 21:50:14
回答 4查看 536关注 0票数 0

我有下面的课程。

代码语言:javascript
运行
复制
class Row
{
   Table* parent_table;
   Row(Table* construct);
}
class Table
{
    std::vector<Row>;
}

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-13 21:53:14

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

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

票数 4
EN

Stack Overflow用户

发布于 2013-03-13 21:51:12

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

实际上,一种更安全、更干净的方法是存储shared_ptr-s,而不是裸指针,这样您就不必处理太多内存管理问题。类似于:

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-13 21:57:09

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

第二:

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

已经被其他人回答了。

首先:

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15387231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档