नीचे दिए गए तुलनित्र फ़ंक्शन का उपयोग करते समय मुझे सेगमेंटेशन गलती मिलती है: -

    class Solution {
    public:
static bool comp( pair<int,pair<int,int> > &a, pair<int,pair<int,int> > &b )
{
    if(a.first <= b.first)
        return 1;
    else
        return 0;
}
int t1(vector<int>& nums, int target)
{
    vector< pair<int,pair<int,int> > > sum_of_two;
    int n=nums.size();
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            sum_of_two.push_back( make_pair( nums[i]+nums[j] ,make_pair(i,j) ) ); 
        }
    }
    sort(sum_of_two.begin(),sum_of_two.end() ,comp );
    return 1;  
}
    };

लेकिन नीचे दिया गया COMP फ़ंक्शन ठीक काम करता है, मैं क्यों नहीं ढूंढ पा रहा हूँ?

      static bool comp( pair<int,pair<int,int> > &a, pair<int,pair<int,int> > &b )
      {
            if(a.first < b.first)
                  return 1;
             else
                  return 0;
      }
0
vikas yadav 20 मार्च 2020, 20:38
1
 – 
pptaszni
20 मार्च 2020, 20:40
क्या आपके sort() को कॉल करने पर seg फॉल्ट निश्चित रूप से हो रहा है?
 – 
LLSv2.0
20 मार्च 2020, 20:44
साथ ही, यह ध्यान दिया जाना चाहिए कि t1() कोई मान नहीं लौटाता है, लेकिन यह int लौटाने की अपेक्षा करता है
 – 
LLSv2.0
20 मार्च 2020, 20:45
Seg गलती सॉर्ट () फ़ंक्शन पर हो रही है
 – 
vikas yadav
20 मार्च 2020, 20:54
"तुलना" फ़ंक्शन वास्तव में ऑर्डरिंग फ़ंक्शन के रूप में है, और आपका कहना है कि किसी भी तत्व को स्वयं से पहले आदेश दिया जाना चाहिए, जो असंभव है।
 – 
molbdnilo
20 मार्च 2020, 20:58

2 जवाब

दोनों तुलना अलग हैं। पहला सख्त कमजोर ऑर्डरिंग लागू नहीं करता है, क्योंकि अगर a.first == b.first तो comp(a, b) और comp(b, a) दोनों सही हो जाएंगे। चूंकि यह तुलना फ़ंक्शन की आवश्यकताओं का उल्लंघन करता है, व्यवहार अपरिभाषित है।

फिक्स आसान है: परीक्षण को इसमें बदलें

if(a.first < b.first)

ताकि दो मान बराबर होने पर यह false वापस आ जाए।

0
1201ProgramAlarm 20 मार्च 2020, 20:53
अगर हम if(a.first <b.first) का उपयोग करते हैं, तो दोनों COMP(a,b) और COMP(b,a) झूठी वापसी करेंगे जब a.first=b.first क्या यह सही होगा?
 – 
vikas yadav
20 मार्च 2020, 20:58
हां। आप 2<2 के झूठे होने की अपेक्षा करेंगे जब 2==2, है ना?
 – 
1201ProgramAlarm
20 मार्च 2020, 20:59
"ए को बी से पहले ऑर्डर नहीं किया गया है" और "बी को ए से पहले ऑर्डर नहीं किया गया है" दोनों एक ही समय में सही हो सकते हैं (उदाहरण के लिए यदि a == b या यदि उन्हें बिल्कुल भी ऑर्डर नहीं किया जा सकता है)। "ए को बी से पहले आदेश दिया गया है" और "बी को ए से पहले आदेश दिया गया है" एक ही समय में सत्य नहीं हो सकता है।
 – 
molbdnilo
20 मार्च 2020, 20:59
static bool comp( pair<int,pair<int,int> > &a, pair<int,pair<int,int> > &b )
      {
            if(a.first <= b.first)
                  return 1;
             else
                  return 0;
      }

सॉर्ट करने की आवश्यकता यह होनी चाहिए कि COMP फ़ंक्शन अधिक से अधिक comp(a, b) और comp(b, a). (यदि equiv(a, b) सत्य है तो यह दोनों में से किसी के लिए भी सही नहीं हो सकता है)।

यदि COMP(a,b) और COMP(b,a) दोनों सत्य हैं तो COMP फ़ंक्शन तुलना करें अवधारणा, और सॉर्ट करने के लिए कॉल UB है।

आपका दूसरा COMP फ़ंक्शन सही है।

0
cigien 20 मार्च 2020, 21:15
लेकिन दूसरा तुलनित्र फ़ंक्शन COMP (a, b) और COMP (b, a) में से किसी के लिए भी सही नहीं है यदि a == b।
 – 
vikas yadav
20 मार्च 2020, 21:00
अगर a.first <b.first तो COMP(a,b) सच हो जाता है।
 – 
cigien
20 मार्च 2020, 21:01
उत्तर संपादित किया
 – 
cigien
20 मार्च 2020, 21:16