当前位置: 首页 > 知识库问答 >
问题:

将多个向量累积到单个容器中,而不进行复制

范哲
2023-03-14

在C 11中是否有可能累积许多std::向量s,每个都由给定的函数(其API我不能更改)返回到std容器中,而无需复制任何元素?

std::vector<int> make_vect();
container acc;                           // what is container?
do {
    acc.append(std::move(make_vect()));  // how to implement this?
} while(acc.size() < n);

注意1,即使元素没有move赋值操作符的move构造函数,也不能复制元素,例如示例中的int。因此,您可以移动一块元素(通过复制指针),但不能移动单个元素。

注意2,容器必须允许使用单个迭代器对所有累积元素进行迭代。So<代码>标准::向量

显然,编写一些允许这样做的容器或使用std::列表是很简单的

似乎所请求的功能并不是什么特别奇怪的东西,我很惊讶即使使用C 11也很难(如果不是不可能的话)。


共有1个答案

毕胡非
2023-03-14

太长别读了,我认为标准容器不能满足你的要求。原因如下。

请记住,容器的移动语义学是有效的,因为它们被实现为动态分配内存的范围绑定句柄。移动容器被实现为复制句柄,而不触摸包含的元素。

您的第一个(显式)约束是不复制任何容器的任何元素。这需要将句柄复制到您假定的acc_container中。换句话说,您需要一个acc_container

第二个(隐式,从注释推断)约束是,您希望在所有单个向量的所有元素上都有一个统一的接口。换句话说,您希望将其用作acc\U容器

标准库中不存在这样的容器。

最简单的解决方法是使用std::向量

不幸的是,即使您提供了非成员start()/end()函数来初始化来自成员的这些间接迭代器。开始()/. end(),range-for也不会使用ADL来查找这些函数,因为它会优先于旧的成员函数。开始()/. end()。此外,您将无法将例如插入()aT元素直接放入复合容器中,除非您还提供非成员插入()(类似于其他功能)。

因此,如果您想要一个真正的复合容器,具有范围支持和成员函数的本机接口,您需要自己编写一个(使用std::向量

更新:这里有一个链接,指向Matt Ostern关于分段迭代器和层次算法的一篇旧论文,该论文展示了这种方法的一些性能优势。缺点是,您还需要让标准算法了解这些迭代器。

 类似资料:
  • 问题内容: 我记得当我发现它是异步的时,我感到非常惊讶。现在,我偶然发现了一种“怪异”的行为,这种行为不符合我对异步性的理解。 考虑下面的代码片段(由于某种原因导致,这是外部沙箱:https : //codesandbox.io/s/zwrvkz74y3): 如果运行此程序并检查控制台,您将看到该调用被两次调用,但是不应该仅一次累积和更新Component吗? 更新 :我认为我的困惑来自React

  • 为了使项目的开发更容易,我在docker容器中放置了它所依赖的几个服务。这使得项目配置中的“localhost”在传递给其中一个容器时具有不同的含义。 编辑 清楚地说,我试图将容器的一个端口转发到主机,因此当容器中运行的进程试图访问localhost:5432时,它将连接到主机的端口5432。 结束 我目前正在使用 将目标为“本地主机”的任何内容重定向到容器的主机。它在这种情况下有效,但我更愿意找

  • 问题内容: 我正在尝试(进行其他测试)将一个引用添加到两个引用中进行测试,并且该引用将从添加到的第一个面板中消失! 那么,Swing组件不能添加到多个容器中吗? 先感谢您。 问题答案: 来自:http : //download.oracle.com/javase/tutorial/uiswing/components/toplevel.html: 每个GUI组件只能包含一次。如果某个组件已经在容器

  • null 转发每个进程的输出 监视是否有子进程死亡,并在此情况下重新启动整个容器 在缩放/停止/重新启动等时优雅地关闭所有进程。

  • 问题内容: 我已经实现了一定数量的所有素数的列表。我试图做的事情很难解释,所以我只用一些硬代码展示一下: 所以从本质上讲,我试图从上一个列表中按顺序取出一个元素,然后按指数倍增,然后将其追加到其他列表中。 我意识到我可以做到这一点,这可能会更容易: 我需要一些想法才能在某种程度上做到这一点。 问题答案: 您需要 累积产品 清单。这是一个简单的食谱: 另一种方法,使用itertools: 或者,也许