与 STL 向量共享数组

Sharing an array with STL vectors

本文关键字:数组 共享 向量 STL      更新时间:2023-10-16

我想一个或多个 STL 向量共享大小a大小k的双精度数组的内容 v1v2 ...vn .

我想要从这个共享存储中获得的效果是,如果底层数组被修改,则可以从与数组共享其内容的所有向量中观察到更改。

我可以通过定义向量来做到这一点 v1 ...vn作为指针的向量

vector<double*> v1;

并将a的指针复制到此向量中a + k。但是,我不喜欢这种解决方案。我希望向量是双精度的向量。

鉴于您可以从向量中提取底层指针,我假设可以使用数组初始化向量,以便共享内容。将不胜感激有关如何执行此操作的帮助。

鉴于您可以从向量中提取底层指针,我假设可以使用数组初始化向量,以便共享内容。

不,你不能这样做。 标准库容器始终管理自己的内存。

最好的选择是创建std::vector<double>,然后在需要的地方将其用作数组(通过 &v[0] ,假设向量为非空(。

如果您只想拥有容器接口,请考虑使用 std::array(或boost::arraystd::tr1::array(或编写自己的容器接口来封装数组。

在我看来,这听起来像是你想用向量为数组配饰。所以从逻辑上讲,你想要一个引用向量(由于语法原因不起作用(。如果你真的需要这个特性,你可以编写你自己的ref包装类,它的行为与实际的C++引用完全一样,所以你的vn向量的用户将无法区分vector<T>vector<ref<T> >(例如,使用T = double(。但在内部,您可以将向量中的项目链接到"master"数组中的项目。

但是你应该有充分的理由来做这个头顶马戏团:)

好的,标准库容器既是信息的持有者,也是这些元素的枚举器。也就是说,几乎任何容器都可以在几乎任何算法中使用,至少,您可以使用 begin()end() .

当你将两者分开(元素保持和元素枚举(时,就像你的情况一样,你可以考虑 boost.range。 boost.range为您提供了一对迭代器,用于限定算法的应用范围,并且您的数组中具有实际的内存存储。这主要用于读取访问它们,因为通常,修改向量的结构将使迭代器无效。不过,您可以重新创建它们。

为了回答你的问题,据我所知,std::vector 不能给出一个已经构造的数组来使用。我什至无法想象如何做到这一点,因为还有与大小/容量相关的变量。您可以尝试使用自定义分配器破解一种方法来做到这一点,但我觉得它会很丑陋,容易出错,并且对于未来的维护不直观。

也就是说,如果我可以稍微改写一下你的话,你要求对同一个 std::vector 进行多次引用。我要么这样做,要么考虑对向量使用shared_ptr。