[英]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]中所述:
在
insert
和emplace
成员不得影响迭代器和引用的有效性的容器,和erase
成员应被擦除的元素仅无效迭代器和引用。
因此, 不可能以这样的方式实现set
,即set
所有元素都存储在单个数组中。
请注意,这与效率要求无关,例如O(log n)插入/删除/查找(如果你真的很难眯眼并且至少允许分摊O(log n)插入时间),或者维护排序顺序,或类似的东西。 如果只是这些,可以使用基础元素之上的数据结构轻松处理它们,并且元素本身可以存储在数组中。 它甚至与迭代器失效的保证没有任何关系,因为迭代器是抽象的。
不,唯一使您退缩的是参考无效要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.