我正在开发一个引擎,用于将现有代码移植到不同的平台.现有代码是使用第三方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中 - 迭代器,指针,索引?
如果在删除对象后尝试访问它们,那么迭代器或指针都会做坏事,因此两者本身都不安全.迭代器的优点是它可以用于访问集合的其他成员.
所以,如果你只是想访问你的Shape,那么指针将是最简单的.如果要遍历列表,请使用迭代器.
索引在列表中是无用的,因为std :: list不会使[]运算符重载.
答案取决于您的代表:
std::list,使用 an iterator(不是指针),因为 aniterator允许您在不遍历整个列表的情况下删除元素。std::mapor boost::unordered_map,使用Key(当然)如果您使用关联容器,您的设计将会非常强大,因为关联容器使您能够查询对象是否存在,而不是调用未定义的行为。
尝试对两者进行基准测试map,unordered_map看看哪一个在您的情况下更快:)