如何在C ++ Map中使用自定义结构

时间:2012-03-26 08:09:42

标签: c++ data-structures collections vector map

我想使用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
    }
};

2 个答案:

答案 0 :(得分:3)

DFSCode的向量可以包含许多DFSCode。由于DFSCode可以 包含许多DFSDFSCode的向量可以包含许多DFS

关于您的代码:一些建议:

  • 使用`push_back`和`pop_back`,而不是`resize`。它还有更多 地道。你的函数`push`应该开始:
        push_back( DFS() );
        back().from() = from;
        ...
    
  • 给`DFS`一个构造函数,它接受它需要的参数:
        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`。使其成为数据成员。

关于订购功能的问题, 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而不是mapmap只能为一个键设置一个值。例如 一对一 关系。 multimap可以为单个密钥设置多个值。

您不需要像antonio建议的那样继承DFScode。