从集合<A*,比较器>中获取A成员以列出<A>

get A members from set<A*,Comparator> to list<A>

本文关键字:lt gt 成员 获取 集合 比较器      更新时间:2023-10-16

我有一组A*指针,指向用比较器(使用struct PtrComparator中的operator())排序的堆上分配的对象,如下所示:set<A*,PtrComparator>

比较器根据作为basic_stringA.m_timeStamp.timeStamp对其进行排序。然而,我被迫使用两个字符串参数描述的范围提取list<A>,并将其返回给调用者。所以我需要使用这两个参数来获得一系列迭代器?然后填写列表?

我该怎么做?

我担心当函数终止时,我创建的任何临时A对象都会被破坏,那么我该如何将其存储在list<A>中呢?我不是被迫再次使用堆吗?

我不允许将list<A>更改为list<A*>,但我可以修改我的实现以适应list<A>返回类型,但是,当试图填充构造函数中某个地方的集合时,我如何解决临时对象的问题。我能用set<A>实现一下吗?

struct PtrComparator;
class A
 {
   public:
                   A           ( const CTimeStamp & timeStamp,
                                 const string     & from,
                                   const ABody  & body,
                                 const Attach    * attach );
    A(const A&);
    ~A();
    const string     & From      ( void ) const;
    const ABody  & Body         ( void ) const;
    const CTimeStamp & TimeStamp  ( void ) const;
    const Attach* Attachment     ( void ) const;
    // will do the above getters later
    friend ostream & operator <<   ( ostream & os, const A & x );
    //friend bool operator< (const A&,const A&);
    friend struct PtrComparator;
   private:
    CTimeStamp m_timeStamp;
    string m_from;
    ABody m_body;
    const Attach * m_ptr_to_attach;
 };
    //normal constructor
 A::A(const CTimeStamp & timeStamp,const string & from,
      const ABody & body,const Attach * attach)
 :m_timeStamp(timeStamp),m_from(from),m_body(body),m_ptr_to_attach(attach)//,count_(0)
 {
    attach->AddRef();
 }
 //copy constructor
{
//similar to normal constructor
}
//destructor
A::~A()
{
    m_ptr_to_attach->Release();
}
 ostream & operator<< (ostream & os,const A & x) 
 {
     os << "body:" <<x.m_body <<" , from: " << x.m_from << " , attachment: " 
     <<  (x.m_ptr_to_attach) <<" , timestamp:" << x.m_timeStamp;
     return os;
 }
struct PtrComparator{
 bool operator()(const A* first,const A* second)
 {
     return first->m_timeStamp.timestamp < second->m_timeStamp.timestamp;
 }
};
class Box_of_A
 {
   public:
                   Box_of_A ();
                   ~Box_of_A();
    bool           Delivery       ( const A      & a );
    bool           NewFolder     ( const string     &  folderName );
    **list<A>    ListOfA      ( const string     & folderName,
                               const CTimeStamp & from,
                               const CTimeStamp & to );**
    typedef map<string,set<A*,PtrComparator> * >::const_iterator  folders_c_it;
    typedef map<string,set<A*,PtrComparator> * >::iterator  folders_it;
   private:
    map<string,set<A*,PtrComparator> * > folders;
 };
bool Box_of_A::Delivery(const A & a)
{
    folders_it it = folders.find("index");
    if(it == folders.end())return false;
    set<A*,PtrComparator>* & folder = it->second;
    A * newA = new A(a);
    folder->insert(newA);
    return true;
}

我错过了功能

list<A>    ListOfA      ( const string     & folderName,
                            const CTimeStamp & from,
                             const CTimeStamp & to );

CTimeStamp有一个成员basic_string timeStamp

有人能告诉我摆脱困境的方法吗?

更改此项:

map<string,set<A*,PtrComparator> * > folders

到此:

map<string,set<A,Comparator> > folders

神奇地,你的生活会变得更好。