我想使用C ++映射结构,例如map<vector<DFSCode>, vector<PDB>> candidate
,DFSCode和PDB是我定义的两种结构。
class DFS {
public:
int from;
int to;
int fromlabel;
int elabel;
int tolabel;
DFS(): from(0), to(0), fromlabel(0), elabel(0), tolabel(0) {};
};
struct DFSCode: public vector <DFS> {
public:
void push (int from, int to, int fromlabel, int elabel, int tolabel)
{
resize (size() + 1);
DFS &d = (*this)[size()-1];
d.from = from;
d.to = to;
d.fromlabel = fromlabel;
d.elabel = elabel;
d.tolabel = tolabel;
}
void pop () { resize (size()-1); }
};
class PDB {
public:
unsigned int tid;
unsigned int gid;
void push(int did, int vid, int vlabel)
{
tuple[did].vid = vid;
tuple[did].vlabel = vlabel;
}
PDB(): tid(0), gid(0), tuple(0) {};
};
我会生成包含vector<DFSCode>
和PDB
的大量数据,因为一个vector<DFSCode>
可能有很多PDB
,我想使用vector<PDB>
来存储它们。
我想做的是:
vector<DFSCode> tempdfscodeList;
PDB temppdb;
map<vector<DFSCode>, vector<PDB>> candidate;
for each `vector<DFSCode>` and `PDB` pair I generate
candidate[tempdfscodeList].push_back(temppdb);
第一个问题是:上述代码是否满足了我的期望“一个vector<DFSCode>
包含许多PDB
”?
第二个问题是:我知道我必须实现一个类似的map方法,因为我使用vector<DFSCode>
作为我的键,但我不知道如何实现。我试着写一个。但似乎不满意我的期望“一个vector<DFSCode>
包含许多PDB
”,任何人都可以帮助我吗? :)
class dfscodeListCompare { // compare vector<DFSCode>
public:
bool operator() (const vector<DFSCode> &c1, const vector<DFSCode> &c2) const
{
for(int I = 0; I < c1.size(); I++) {
if(c1[I].size() == c2[I].size()) { // the size must be the same
for(int j = 0; j < c1[I].size(); j++) {
if((c1[I][j].from != c2[I][j].from) || (c1[I][j].to != c2[I][j].to) || (c1[I][j].fromlabel != c2[I][j].fromlabel) || (c1[I][j].elabel != c2[I][j].elabel) || (c1[I][j].tolabel != c2[I][j].tolabel))
return false; // if there exist one different
}
}
else
return false;
}
return true; // pass all condition
}
};
答案 0 :(得分:3)
DFSCode
的向量可以包含许多DFSCode
。由于DFSCode
可以
包含许多DFS
,DFSCode
的向量可以包含许多DFS
。
关于您的代码:一些建议:
push_back( DFS() ); back().from() = from; ...
DFS::DFS( int from, int to, int fromLabel, int eLabel, int toLabel ) : from( from ) , to( to ) , fromLabel( fromLabel ) , eLabel( eLabel) , toLabel( toLabel ) { }然后`push`变得简单: push_back(DFS(from,to,fromLabel,eLabel,toLabel));
关于订购功能的问题,
std::vector<DFSCode>
基本上是一个二维结构。这个
可以通过lexicographical_compare
:
struct CompareDFSCode
{
bool operator()( DFS const& lhs, DFS const& rhs ) const
{
if ( lhs.from != rhs.from )
return lhs.from < rhs.from;
else if ( lhs.to != rhs.to )
return lhs.to < rhs.to;
else if ( lhs.fromLabel != rhs.fromLabel )
return lhs.fromLabel < rhs.fromLabel;
else if ( lhs.eLabel != rhs.eLabel )
return lhs.eLabel < rhs.eLabel;
else
return lhs.toLabel < rhs.toLabel;
}
bool operator()( DFSCode const& lhs, DFSCode const& rhs ) const
{
return std::lexicographical_compare(
lhs,begin(), lhs.end(),
rhs.begin(), rhs.end(),
*this );
}
bool operator()(
std::vector<DFSCode> const& lhs,
std::vector<DFSCode> const& rhs ) const
{
return std::lexicographical_compare(
lhs.begin(), lhs.end(),
rhs.begin(), rhs.end(),
*this );
}
};
编辑:
我忘了提到一个重点。通过上面的比较 运算符,向量中项的顺序很重要。如果是这样的话 不可接受,那么你可能不得不最终排序元素 首先(暂时)。
答案 1 :(得分:0)
第一个问题是:上面的代码是否满足了我对“一个载体包含许多PDB”的期望?
转到multimap
而不是map
。
map
只能为一个键设置一个值。例如 一对一 关系。
multimap
可以为单个密钥设置多个值。
您不需要像antonio建议的那样继承DFScode。