与 STL 向量共享数组
Sharing an array with STL vectors
我想与一个或多个 STL 向量共享大小a
大小k
的双精度数组的内容 v1
, v2
...vn
.
我想要从这个共享存储中获得的效果是,如果底层数组被修改,则可以从与数组共享其内容的所有向量中观察到更改。
我可以通过定义向量来做到这一点 v1
...vn
作为指针的向量
vector<double*> v1;
并将a
的指针复制到此向量中a + k
。但是,我不喜欢这种解决方案。我希望向量是双精度的向量。
鉴于您可以从向量中提取底层指针,我假设可以使用数组初始化向量,以便共享内容。将不胜感激有关如何执行此操作的帮助。
鉴于您可以从向量中提取底层指针,我假设可以使用数组初始化向量,以便共享内容。
不,你不能这样做。 标准库容器始终管理自己的内存。
最好的选择是创建std::vector<double>
,然后在需要的地方将其用作数组(通过 &v[0]
,假设向量为非空(。
如果您只想拥有容器接口,请考虑使用 std::array
(或boost::array
或std::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。
- 如何在类中安全地访问 const 共享数组
- 在 MPI 中共享数组的一部分
- 在两个结构之间共享数组
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- MPI_Get仅从共享内存区域读取数组的第一个元素
- 共享_ptr中多功能数组的类型是什么
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- 在 MPI (C++) 中共享整数数组
- CUDA 将大于线程计数的数组复制到共享内存
- C++11 在不同类之间共享固定大小的数组
- 当我可以创建共享指针时,为什么我不能创建指向数组的唯一指针?
- 对相邻数组元素使用共享内存
- 共享库的C 访问数组数据
- c++ WINAPI 共享内存结构数组
- C 98 Mutex中共享数组的锁定变量
- 提升共享指针数组
- 动态分配的 int 数组的共享指针触发了断点
- 如何在分叉之间共享数组
- 使用共享指针创建的链表数组