2

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

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

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


如果不可能,使向量脱离集合的最佳方法是什么?我的意思是没有循环遍历所有元素。

4

2 回答 2

6

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

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

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

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

希望这可以帮助!

于 2013-01-24T02:29:48.697 回答
1

不,不可能以set您可以执行此操作的方式实施。

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

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

insertandemplace成员不应影响迭代器和对容器的引用的有效性,并且成员erase应仅使迭代器和对已擦除元素的引用无效。

所以不可能set这样一种方式实现,即集合的所有元素都存储在一个数组中。

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

不,唯一阻碍你的是参考失效要求。

于 2013-01-24T03:05:53.370 回答