2013-01-24 25 views
2

要得到的指針向量中的數據,我們可以使用獲取指向原始數據集像&(矢量[0])

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

那是可能得到的指針在數據set?我可以將它用作上面的數組指針嗎?


如果沒有可能的,什麼是做一個向量出一套最好的方法是什麼?我的意思是沒有循環所有元素。

+1

在一個向量中,該數據是連續的。這將如何在一套工作? – chris

+0

數據容器應該也是連續的集合!爲什麼不?我不是指元素的順序,而是元素的存儲。否則效率可能不高。 – Hesam

+1

不太可能。不能保證該標準是連續的,並且使其連續可能會破壞一些複雜性要求。 – chris

回答

6

不,這不一定可行。 C++ ISO標準明確保證std::vector中元素的連續存儲,因此您可以安全地獲取第一個元素的地址,然後像使用原始數組一樣使用該指針。標準庫中的其他容器不具備此保證。

原因是爲了有效地支持大多數std::set上的操作,實現需要使用複雜數據結構(如平衡二叉搜索樹)來存儲和組織數據。這些結構本質上是非線性的,需要將節點分配並鏈接在一起。有效地得到這與在一個平面陣列中的元素的工作將是困難的,如果不是不可能的,在由標準中規定的時間的限制

EDIT(對於大多數操作攤銷O(log n)的。):在迴應你的問題 - 沒有辦法從std::set建立一個std::vector沒有一些代碼遍歷集合和複製元素。你可以做到這一點不明確使用您的任何循環利用std::vector範圍構造:

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

希望這有助於!

+0

謝謝,什麼是使一個向量不成立的最佳方式? – Hesam

+1

@ Hesa​​m-看到我更新的答案。 – templatetypedef

+0

它也適用於map:vec(myMap.begin(),myMap.end()); ? – Hesam

1

不可能以這樣的方式實現set

如果您以這種方式實現set,即元素存儲在單個數組中,那麼當添加更多元素時,該數組將不可避免地需要在某個點重新分配。那時,任何對現有元素的引用都將失效。

之一的set特點是,它保證,如果添加(或刪除)等元素,元素的引用將永遠不會失效。正如[associative.reqmts]說:

insertemplace成員不得影響迭代器和引用的有效性的容器,和erase成員應被擦除的元素僅無效迭代器和引用。

所以這是不可能所有集合中的元素都存儲在一個單一陣列這樣的方式來實現set。請注意,這與效率要求無關,例如O(log n)插入/刪除/查找(如果您真的很難眯起眼睛並允許至少分期放置O(log n)插入時間),或者維護排序順序,或類似的東西。如果僅僅是這些,他們可以很容易地在底層元素之上用數據結構來處理,並且元素本身可以被存儲在一個數組中。因爲迭代器是抽象的,所以它甚至與關於迭代器無效的保證甚至沒有任何關係。

不,唯一讓你退縮的是參考失效要求。