带指针的C ++ STL容器:几个问题

时间:2011-09-03 11:53:49

标签: c++ pointers stl subclass

假设您有类型T和子类型TSub1TSub2等。

其中一些子类型使用new TSub(...)初始化。然后将结果指针存储为:

中的元素
list<T*> tsList;

相同的指针也用作以下键:

map<T*,V> tsMap;

现在考虑使用迭代器变量tsList进行tIter的迭代。

以下是我的问题:

  
      
  1. tsMap[*tIter] tsMap.find(*tIter) 都会成功   找到正确的关联值?

  2.   
  3. delete *tIter 会成功释放完整内存块   已分配给相关的 TSub ,即使STL将类型视为   的 T

  4.   
  5. 假设已定义方法 T::foo() 并覆盖 TSub::foo()

         

    (*tIter)->foo() 会调用 T::foo() TSub::foo() 吗?

  6.   

上下文是:希望每个TSub以单例形式实例化,但以允许迭代考虑作为超类型的方式存储,并调用子类中重写的方法。

我非常感谢您提供明智的解释。谢谢你的时间!

2 个答案:

答案 0 :(得分:6)

  

tsMap [* tIter]和tsMap.find(* tIter)都会成功找到   正确的相关价值?

是的,但如果tsMap [* tIter]找不到密钥,它将创建一个默认值。

  

将删除* tIter成功释放分配的完整内存块   对于相关的TSub,即使STL将类型视为T?

当且仅当T的析构函数是虚拟的

  

假设有一个已定义的方法T :: foo()并覆盖TSub :: foo()。

     

Will(* tIter) - &gt; foo()调用T :: foo()或TSub :: foo()?

如果T :: foo不是虚拟的,它将调用T :: foo。否则它将调用TSub :: foo()

答案 1 :(得分:0)

我建议从提升中查看Pointer Container Library

另外,我建议

  

tsMap [* tIter]和tsMap.find(* tIter)是否都能成功找到正确的关联值?

取决于成功的定义。如果指针标识是关键标识,则是。如果需要比较指向对象,则需要提供一个比较器函数对象( c ++ 0x中的类型)。

效率相当低的PoC :(见http://ideone.com/TpgLw

#include <map>
#include <functional>

template <typename T>
    static bool indirectLess(const T* a, const T* b)
{
    if (a==b) 
        return false;
    if (!a)
        return true;
    if (!b)
        return false;
    return std::less<T>()(*a, *b);
}

typedef int T;
typedef int V;

int main()
{
    typedef bool (*cmp_t)(const T*, const T*);

    std::map<T*,V,cmp_t> tsMap(&indirectLess<T>);
}