簡體   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