我应该返回一个迭代器或一个指向STL容器中元素的指针吗?

Bee*_*and 5 c++ stl

我正在开发一个引擎,用于将现有代码移植到不同的平台.现有代码是使用第三方API开发的,我的引擎将根据我的新平台重新定义这些第三方API函数.

以下定义来自API:

typedef unsigned long shape_handle;    
shape_handle make_new_shape( int type );
Run Code Online (Sandbox Code Playgroud)

我需要重新定义make_new_shape,我可以选择重新定义shape_handle.

我已经定义了这个结构(简化):

struct Shape
{
    int type
};
Run Code Online (Sandbox Code Playgroud)

调用者make_new_shape并不关心底层结构Shape,只需要一个"句柄"就可以调用以下函数:

void `set_shape_color( myshape, RED );`
Run Code Online (Sandbox Code Playgroud)

myshape形状的句柄在哪里.

我的引擎将管理Shape对象的内存,并且其他要求规定引擎应该将Shape对象存储在列表或其他可迭代容器中.

我的问题是,表示此句柄最安全的方法是什么 - 如果它Shape本身将存储在std :: list中 - 迭代器,指针,索引?

dor*_*ron 6

如果在删除对象后尝试访问它们,那么迭代器或指针都会做坏事,因此两者本身都不安全.迭代器的优点是它可以用于访问集合的其他成员.

所以,如果你只是想访问你的Shape,那么指针将是最简单的.如果要遍历列表,请使用迭代器.

索引在列表中是无用的,因为std :: list不会使[]运算符重载.


Mat*_* M. 3

答案取决于您的代表:

  • 对于std::list,使用 an iterator(不是指针),因为 aniterator允许您在不遍历整个列表的情况下删除元素。
  • 对于std::mapor boost::unordered_map,使用Key(当然)

如果您使用关联容器,您的设计将会非常强大,因为关联容器使您能够查询对象是否存在,而不是调用未定义的行为。

尝试对两者进行基准测试mapunordered_map看看哪一个在您的情况下更快:)