要获取向量中数据的指针,我们可以使用
vector<double> Vec;
double* Array_Pointer = &(Vec[0]);
Function(Array_Pointer);
可以在设置中获取指向数据的指针吗?我可以像上面一样使用它作为数组指针吗?
如果不可能,将矢量设置为最佳方法是什么?我的意思是没有循环所有元素。
答案 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]中所述:
insert
和emplace
成员不应影响迭代器和对容器的引用的有效性,erase
成员应仅使迭代器和对已擦除元素的引用无效。
所以不可能以这样一种方式实现set
,即集合的所有元素都存储在一个数组中。
请注意,这与效率要求无关,例如O(log n)插入/删除/查找(如果您真的很难眯眼并允许至少分摊的O(log n)插入时间),或者维护排序顺序,或类似的东西。如果只是这些,可以使用基础元素之上的数据结构轻松处理它们,并且元素本身可以存储在数组中。它甚至与 iterator 失效的保证没有任何关系,因为迭代器是抽象的。
不,唯一阻碍你的是参考无效要求。