![](/img/trans.png)
[英]How to store pointer / iterator reference to stl container element in C++?
[英]Should I return an iterator or a pointer to an element in a STL container?
我正在開發一個引擎,用於將現有代碼移植到不同的平台。 現有代碼是使用第三方API開發的,我的引擎將根據我的新平台重新定義這些第三方API函數。
以下定義來自API:
typedef unsigned long shape_handle;
shape_handle make_new_shape( int type );
我需要重新定義make_new_shape
,我可以選擇重新定義shape_handle
。
我已經定義了這個結構(簡化):
struct Shape
{
int type
};
make_new_shape
的調用者不關心Shape
的底層結構,只需要一個“句柄”就可以調用以下函數:
void `set_shape_color( myshape, RED );`
其中myshape
是形狀的句柄。
我的引擎將管理Shape
對象的內存,並且其他要求規定引擎應該將Shape
對象存儲在列表或其他可迭代容器中。
我的問題是,表示此句柄最安全的方法是什么 - 如果Shape
本身將存儲在std :: list中 - 迭代器,指針,索引?
如果在刪除對象后嘗試訪問它們,那么迭代器或指針都會做壞事,所以它們本身都不安全。 迭代器的優點是它可以用於訪問集合的其他成員。
所以,如果你只是想訪問你的Shape,那么指針將是最簡單的。 如果要遍歷列表,請使用迭代器。
索引在列表中是無用的,因為std :: list不會使[]運算符重載。
IIF內部表示將是一個Shapes列表,然后指針和迭代器是安全的。 分配元素后,不會發生重定位。 我不建議使用索引來明顯訪問性能。 列表中的O(n)。
如果使用向量,則不要使用迭代器或指針,因為當超過向量容量時可以重新定位元素,並且指針/迭代器將變為無效。
如果您想要一個安全的表示而不管內部容器,那么創建一個指向您的形狀的指針的容器(列表/向量),並將形狀指針返回給您的客戶端。 即使容器在內存中移動,Shape對象也將保留在同一位置。
答案取決於你的代表:
std::list
,使用iterator
(而不是指針),因為iterator
允許您刪除元素而不會遍歷整個列表。 std::map
或boost::unordered_map
,使用Key
(當然) 如果使用關聯容器,您的設計會非常強大,因為關聯容器使您能夠查詢對象的存在,而不是調用未定義的行為。
嘗試對map
和unordered_map
進行基准測試,看看你的情況哪一個更快:)
迭代器並不比指針更安全,但如果您使用的是檢查STL實現比原始指針更好的診斷!
例如,在調試版本中,如果返回指向列表元素的指針,然后擦除該列表元素,則會有一個懸空指針。 如果你訪問它就會崩潰,所有你能看到的就是垃圾數據。 這可能很難弄清楚出了什么問題。
如果你使用迭代器並且你有一個經過檢查的STL實現,只要你訪問一個擦除元素的迭代器,就會得到類似“迭代器被無效”的消息。 那是因為你刪除了它指向的元素。 Boom,你剛剛為自己節省了大量的調試工作。
因此,不是O(n)性能的指標。 在指針和迭代器之間 - 總是迭代器!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.