繁体   English   中英

获取指向原始数据的指针,如&(vector [0])

[英]Get pointer to raw data in set like &(vector[0])

要获取指向矢量中数据的指针,我们可以使用

vector<double> Vec;    
double* Array_Pointer = &(Vec[0]);
Function(Array_Pointer);

是否有可能获得指向集合中数据的指针? 我可以像上面那样使用它作为数组指针吗?


如果不可能,将一个向量设置为最佳方法是什么? 我的意思是没有循环所有元素。

不,这不一定是可能的。 C ++ ISO标准明确保证std::vector中元素的连续存储,因此您可以安全地获取第一个元素的地址,然后使用该指针,就像指向原始数组一样。 标准库中的其他容器没有此保证。

这样做的原因是为了有效地支持std::set上的大多数操作,实现需要使用复杂的数据结构,如平衡二进制搜索树来存储和组织数据。 这些结构本质上是非线性的,需要分配节点并将其链接在一起。 如果不是不可能的话,在标准规定的时间限制(大多数操作的摊销O(log n))中,有效地使用扁平阵列中的元素将很难(如果不是不可能)。)

编辑 :回答你的问题 - 没有办法从std::set构建一个std::vector ,而没有一些代码在某处迭代整个集合并复制元素。 您可以通过使用std::vector范围构造函数自己进行此操作而无需显式使用任何循环:

std::vector<T> vec(mySet.begin(), mySet.end());

希望这可以帮助!

不可以。以这种方式实现set是不可能的。

如果以将元素存储在单个数组中的方式实现set ,那么当您添加更多元素时,将不可避免地需要在某个时候重新分配该数组。 届时,对现有元素的任何引用都将失效。

set一个特性是它保证如果添加(或删除)其他元素,对元素的引用永远不会失效。 如[associative.reqmts]中所述:

insertemplace成员不得影响迭代器和引用的有效性的容器,和erase成员应被擦除的元素仅无效迭代器和引用。

因此, 不可能以这样的方式实现set ,即set所有元素都存储在单个数组中。

请注意,这与效率要求无关,例如O(log n)插入/删除/查找(如果你真的很难眯眼并且至少允许分摊O(log n)插入时间),或者维护排序顺序,或类似的东西。 如果只是这些,可以使用基础元素之上的数据结构轻松处理它们,并且元素本身可以存储在数组中。 它甚至与迭代器失效的保证没有任何关系,因为迭代器是抽象的。

不,唯一使您退缩的是参考无效要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM