获取像&(vector [0])这样的集合中的原始数据的指针

时间:2013-01-24 02:24:14

标签: c++ pointers vector set containers

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

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

可以在设置中获取指向数据的指针吗?我可以像上面一样使用它作为数组指针吗?


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

2 个答案:

答案 0 :(得分:6)

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

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

编辑:在回答您的问题时 - 没有办法从std::vector构建std::set而没有某些代码迭代整个集合并复制元素。您可以使用std::vector范围构造函数自行使用任何循环来执行此操作:

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

希望这有帮助!

答案 1 :(得分:1)

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

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

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

  

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

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

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

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