我有一套 A*
指向堆上分配的对象的指针使用比较器排序(使用 operator()
中的 struct PtrComparator
),如下所示: set<A*,PtrComparator>
比较器根据A.m_timeStamp.timeStamp
对其进行排序这是 basic_string
.
但是我被迫提取一个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
神奇的是,你的生活会变得更好。
关于c++ - 从 set<A*,Comparator> 获取 A 成员到 list<A>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317371/