سؤال

أحاول إدخال بعض قيمة الزوج في خريطة. قد تتكون الخريطة من قبل كائن ومتجه كائن آخر. لا أعرف لماذا ولكن الطريقة الوحيدة لجعل الرمز المطلوب تجميعها هي إعلان الكائن الأول مثل المؤشر. ولكن بهذه الطريقة عندما أدخل بعض الكائنات ، يتم وضع الزوج الأول فقط في الخريطة.

خريطتي هذه:

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;
 }

}

وبهذه الطريقة ، لدي خطأ في التجميع في زوج الفصل. ماذا يمكنني أن أفعل؟؟ شكرا جزيلا لك.

هل كانت مفيدة؟

المحلول

تحتاج إلى توفير مقارنة لـ Prmedge. أظن أنه يستخدم المقارنة الافتراضية للخريطة ، على سبيل المثال مقارنة عنوان المفتاح - وهو دائمًا ما يكون ذلك بسبب e محلي.

يجب طلب الكائنات التي تعمل كمفاتيح في الخريطة ، لذلك تحتاج إما إلى تزويد المشغل لمقارنة الحواف ، أو وظيفة المقارنة للخريطة.

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

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

الجزء الصعب حقًا هو تحديد كيفية مقارنة الحواف بحيث يتم تحديد ترتيب نهائي. على افتراض أن لديك فقط from و to يمكنك المحاولة مع:

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.

نصائح أخرى

الفصل 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));

يتم طلب عناصر الخريطة من قبل مفاتيحهم. لكن الخريطة تحتاج إلى معرفة كيف:

إما الزائد < مشغل في فئة 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top