C++带指针的 STL 容器:几个问题
假设您有一个类型 T
和子类型 TSub1
、TSub2
等。
其中一些子类型是使用 new TSub(.. .)
。然后,结果指针将作为元素存储在:
list<T*> tsList;
相同的指针也用作键:
map<T*,V> tsMap;
现在考虑使用迭代器变量 tIter 来对 tsList
进行迭代。
这是我的问题:
tsMap[*tIter]
和tsMap.find(*tIter)
都会成功吗 找到正确的关联值?是否会
删除 *tIter
成功释放整个内存块 分配给相关的TSub
即使 STL 将类型视为T
?假设有一个已定义的方法
T::foo()
并覆盖TSub::foo()
。将
(*tIter)->foo()
调用T::foo()
或TSub::foo()
?
上下文是:每个 TSub 都希望以单例方式实例化,但以允许作为超类型进行迭代考虑的方式存储,并在被调用的子类中重写方法。
我将非常感谢您的知情解释。谢谢您的宝贵时间!
Let's say you have a type T
and subtypes TSub1
, TSub2
etc.
Several of these subtypes are initialised with new TSub(...)
. The resulting pointers are then stored as elements in:
list<T*> tsList;
The same pointers are also used as keys in:
map<T*,V> tsMap;
Now consider an iteration over tsList
, with iterator variable tIter
.
Here are my questions:
Will
tsMap[*tIter]
andtsMap.find(*tIter)
both successfully
find the correct associated value?Will
delete *tIter
successfully free the full memory block
allocated for the relevantTSub
even though STL sees the type asT
?Assume there is a defined method
T::foo()
and overrideTSub::foo()
.Will
(*tIter)->foo()
callT::foo()
orTSub::foo()
?
The context is: each TSub
is desired to be instantiated in singleton fashion, yet be stored in a manner allowing iterative consideration as the supertype, with methods overridden in the subclass being called.
I'd be very grateful for an informed explanation. Thank you for your time!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的,但是如果 tsMap[*tIter] 找不到该键,它将创建一个默认值。
当且仅当 T 的析构函数是虚函数
如果 T::foo 不是虚拟的,它将调用 T::foo。否则它将调用 TSub::foo()
Yes, but tsMap[*tIter] will create a default value if it doesn't find the key.
If and only if the destructor of T is virtual
It will call T::foo if T::foo is not virtual. Otherwise it will call TSub::foo()
我建议从 boost 查看 指针容器库 。
另外,我建议
取决于成功的定义。如果指针标识是关键标识,则可以。如果您需要比较指针对象,则需要提供一个比较器函数对象(c++0x 中的可调用类型)。
效率相当低的 PoC:(请参阅 http://ideone.com/TpgLw)
I suggest looking at Pointer Container Library from boost.
In addition, I'd suggest that
depends on the definition of successfully. If pointer identity is key identity, yes. If you need to compare pointee objects instead, you need to supply a comparer function object (callable type in c++0x speak).
Rather inefficient PoC: (see http://ideone.com/TpgLw)