簡體   English   中英

我應該返回一個迭代器或一個指向STL容器中元素的指針嗎?

[英]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::mapboost::unordered_map ,使用Key (當然)

如果使用關聯容器,您的設計會非常強大,因為關聯容器使您能夠查詢對象的存在,而不是調用未定義的行為。

嘗試對mapunordered_map進行基准測試,看看你的情況哪一個更快:)

迭代器並不比指針更安全,但如果您使用的是檢查STL實現比原始指針更好的診斷!

例如,在調試版本中,如果返回指向列表元素的指針,然后擦除該列表元素,則會有一個懸空指針。 如果你訪問它就會崩潰,所有你能看到的就是垃圾數據。 這可能很難弄清楚出了什么問題。

如果你使用迭代器並且你有一個經過檢查的STL實現,只要你訪問一個擦除元素的迭代器,就會得到類似“迭代器被無效”的消息。 那是因為你刪除了它指向的元素。 Boom,你剛剛為自己節省了大量的調試工作。

因此,不是O(n)性能的指標。 在指針和迭代器之間 - 總是迭代器!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM