[英]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.