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

使用与double数组的内存匹配的std::vector

微生博简
2023-03-14

我正在尝试连接两个现有的代码库——一个在C中,另一个在C中。C代码使用std::vector,而另一个基于double数组。我想从C代码中传递double数组,对C代码中的std::vectors执行操作,并最终在double数组中反映这些操作。

有没有可能创建一个std::vector来匹配double数组占用的内存?

我已经尝试了几个选项,但是它们都涉及到创建一个新的向量和一个双向量数组的副本。例如:

void fcn(double* a, int sizeofa)
{
    std::vector<double> vect_a;
    vect_a.assign(a, a + sizeofa);

    // operations on vect_a

    for (int i=0;i<sizeofa;i++) { a[i] = vect_a[i]; }
}

共有2个答案

司浩壤
2023-03-14

在C语言中,需要容器的函数通常通过模板化的迭代器对来表示容器。这非常方便,尤其是在与外部库接口时,因为迭代器不是一种类型。它是一个概念,只是一个定义类型应该是什么样子的接口。事实证明,C风格的指针是有效的迭代器。这意味着您可以使用任何接受迭代器和任何C数组的C函数。

现在来回答你的问题。在其他答案中,有人明确指出,不能让std::vector控制由C数组分配的内存,因为std::vector需要对数据拥有完全所有权,因为它不知道如何取消分配它。您可以将C数组复制到向量中,但是使用std::vector没有任何意义,除非您想要它的大小调整功能。

总而言之:尽量不要把d::矢量转换成函数,因为迭代器更通用。如果你必须避免模板(虚拟函数等)而不是使用C样式数组,因为它们也非常灵活,你可以把d::矢量转换成C数组,但是另一种方法需要一个副本。

我知道这很难,如果你已经让你的代码接口与std::向量s,在这种情况下,副本是唯一可能的方法。当您不需要调整数组的大小时,更喜欢C风格的数组,也许在未来std::array_view

严烨
2023-03-14

正如评论中所指出的,std::vector管理自己的内存,您不能让它使用其他内存作为备份存储(如果大小发生变化,以及其他问题,它将不知道该怎么做)。

但你可能根本不需要向量;如果您只是将矢量用于非动态尺寸相关功能,则很可能只使用

 类似资料:
  • 问题内容: 我有一个双重数组。我尝试了如下操作 它不打印任何内容。然后我把它做成一个双数组 它打印。 有人可以解释为什么存在这种差异吗? 问题答案: 您的第一个调用实际上是返回-将参数自动装箱,因为a 不是…。泛型不允许将基本类型用作类型参数。 如果您要将a 转换为,则需要手动执行,或使用第三方库来执行。例如: 请注意,与数组的任何后续更改不同,它 不会 反映在列表中,反之亦然-它是副本,而不是视

  • 这种思考方式(静态+动态对于每个字符串是它占用的全部内存)正确吗? 也就是说,如果我有一个Std::string向量,并且我也想计算该向量的所有内存,我需要做同样的事情:我把向量的初始/静态大小加到动态部分,这意味着一个字符串占用的总内存,就像上面对向量中的每个字符串所做的那样? 总而言之,这是我的“缓存”占用的正确内存量吗? 对于每个-我需要添加,另外对于每个-添加??

  • 我正在使用python来分析一些大文件,我遇到了内存问题,所以我一直在使用sys.getsizeof()来尝试跟踪使用情况,但是它在Numpy数组中的行为很奇怪。这里有一个例子,涉及到我必须打开的反照率地图: 数据仍然存在,但是对象的大小,一个3600x7200像素的映射,已经从200 Mb变为80字节。我希望我的内存问题结束,把所有的东西都转换成numpy数组,但我觉得这种行为,如果是真的,会在

  • 我有一个关于火花执行器内存的被遗忘已久的问题。我在代码中为火花作业提供了这些参数。 案例1: 执行人 这是运行的执行器数量及其内存的样子 为什么分配的内存是53248MB(52GB)?它是否也与开销内存值相加?即使是这样= 因此,我再次更改了作业中的内存参数,如下所示: 案例2:这次我给了司机 后台的执行者: 如果添加了所有内存编号,它仍会变为:4 个执行程序 * 每个执行程序 2gb = 火花提

  • 当我在下面编译这个timer.hpp头文件时,编译器说: 错误:“operator=”(操作数类型为“std::chrono::_v2::system_clock::time_point{aka std::chrono::time_point>>}”和“std::__success_type>>::type{aka std::chrono::duration>}”)不匹配)end=std::chr

  • 错误:无法将类型为“std::_bit_reference&”的非常量lvalue引用绑定到类型为“std::vector::reference”{aka“std::_bit_reference”}的rvalue 因此,它抱怨,因为只有第二个参数是rvalue