Я хочу использовать структуру карты 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
»?
Второй вопрос:Я знаю, что должен реализовать сопоставимый метод отображения, поскольку я использую 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
}
};