将一对对象插入地图中

时间:2010-01-27 09:53:26

标签: c++

我正在尝试将一些配对值插入地图中。 May map由对象和另一个对象的向量组成。我不知道为什么,但是编译代码的唯一方法是将第一个对象声明为指针。但是当我插入一些对象时,只有第一对被放入地图中。

我的地图是这样的:

map<prmEdge,vector<prmNode> > archi;

这是代码:

{

bool prmPlanner::insert_edge(int from,int to,int h) {

prmEdge e; 
int f=from; 
int t=to; 
if(to<from){
    f=to;
    t=from; 
} 

e.setFrom(f);
e.setTo(t);

vector<prmNode> app;

prmNode par=nodes[e.getFrom()]; 
prmNode arr=nodes[e.getTo()];

app.push_back(par);
app.push_back(arr);

archi.insert(pair<prmEdge,vector<prmNode> >(e,app) );

return true;
 }

}

这样,我在类pair.h中编译时出错。 我能做什么??非常感谢你。

3 个答案:

答案 0 :(得分:1)

您需要为prmEdge提供比较器。我的猜测是它使用地图的默认比较器,例如比较密钥的地址 - 由于e是本地的,因此总是相同的。

需要对地图中用作键的对象进行排序,因此您需要提供用于比较边的运算符,或者用于映射的比较器函数。

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      // ... ?
   }
};

map<prmEdge,vector<prmNode>, EdgeComparator > archi;

真正困难的部分是决定如何比较边缘,以便定义明确的顺序。假设您只有fromto,您可以尝试使用:

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      if ( emp1.from != emp2.from ) 
          return ( emp1.from < emp2.from );
      return ( emp1.to < emp2.to );
   }
};

它将对主键from和辅助to进行排序。

答案 1 :(得分:1)

prmEdge需要定义一个比较函数(默认为operator<)以与std::map一起使用。虽然您没有发布该代码,但我希望这是您的问题(对于记录,指针定义了operator<

struct A {
    int a;
    bool operator<(A other)
    {
        return a < other.a;
    }
};

struct B {
    int b;
};

bool cmp(B lhs, B rhs)
{
    return lhs.b < rhs.b;
}

std::map<A, int> map_a;
std::map<B, int, std::pointer_to_binary_function<B, B, bool> > map_b(std::ptr_fun(cmp));

答案 2 :(得分:0)

地图元素按其键排序。但地图需要知道如何:

要么重载prmEdge类中的<运算符......

class prmEdge
{
    //...
    public:
        bool operator<(const prmEdge& right) const
        {
            //...
        }
};

...或为地图指定比较器:

class Comparator
{
    public:
        bool operator()(const prmEdge& left, const prmEdge& right) const 
        {
          // ...
        }
};

map<prmEdge, vector<prmNode>, Comparator> archi;