दिलचस्प पोस्ट
उल्का टेम्पलेट ईवेंट हैंडलर्स में "यह" का संदर्भ (टेम्पलेटिंग के लिए हैंडलबार का उपयोग करना) क्या php (जैसे मेल) में फ़ंक्शन को बदलना और इसे कुछ और करना संभव है? सर्वश्रेष्ठ अभ्यास: अभिविन्यास परिवर्तन के दौरान AsyncTask बहुपक्षीय प्रकार का प्रकार बहिष्कृत है बल्क में सबसे तेज़ तरीका एसक्यूएल सर्वर (सी # क्लाइंट) में बहुत सारे डेटा डालने का क्या तरीका है क्या गिट में फाइलें बदलना / नाम बदलने और उनके इतिहास को बनाए रखना संभव है? 3 डी सतह को 3 डी पॉइंट दिए जाने के लिए सरल तरीका क्या मुझे लेबल टैग के अंदर इनपुट टैग डालनी चाहिए? एसईसीएल क्वेरी से वेतन तालिका से नौवीं सबसे ज्यादा वेतन मिलता है यूज़रनेम और पासवर्ड के साथ पोस्ट अनुरोध भेजना और सत्र कुकी को बचाने के लिए कैसे रुबी में बाहरी चक्र को तोड़ने के लिए? विभिन्न SELECT क्वेरीज़ के आउटपुट को वापस करने के लिए पीएल / पीजीएसयूएल फ़ंक्शन रिफैक्टर करें क्या कई आदानों को पता करने के लिए कोणीय रास्ता है? एसक्यूएल केस स्टेटमेंट सिंटैक्स? शाखाओं की सूची कैसे करें जो कि बराबर प्रतिबद्ध हैं

संरचनाओं के एक वेक्टर के साथ std :: sort का उपयोग कैसे करें और फंक्शन की तुलना करें?

सी में समाधान के लिए धन्यवाद, अब मैं इसे std :: sort और vector का उपयोग करके सी ++ में प्राप्त करना चाहता हूं:

typedef struct { double x; double y; double alfa; } pkt; 

vector< pkt > wektor; पुश_बैक () का उपयोग करके भरा हुआ; फ़ंक्शन की तुलना करें:

 int porownaj(const void *p_a, const void *p_b) { pkt *pkt_a = (pkt *) p_a; pkt *pkt_b = (pkt *) p_b; if (pkt_a->alfa > pkt_b->alfa) return 1; if (pkt_a->alfa < pkt_b->alfa) return -1; if (pkt_a->x > pkt_b->x) return 1; if (pkt_a->x < pkt_b->x) return -1; return 0; } sort(wektor.begin(), wektor.end(), porownaj); // this makes loads of errors on compile time 

क्या सही है? उस स्थिति में ठीक से std :: sort का उपयोग कैसे करें?

Solutions Collecting From Web of "संरचनाओं के एक वेक्टर के साथ std :: sort का उपयोग कैसे करें और फंक्शन की तुलना करें?"

std::sort qsort में प्रयुक्त भिन्न से एक भिन्न तुलना फ़ंक्शन लेता है। -1, 0 या 1 लौटने के बजाय, यह फ़ंक्शन किसी bool मान को वापस करने की अपेक्षा करता है, यह दर्शाता है कि पहले तत्व दूसरे से कम है या नहीं।

आपके पास दो संभावनाएं हैं: आपके ऑब्जेक्ट के लिए operator < लागू करें; उस स्थिति में, तीसरे तर्क के बिना डिफ़ॉल्ट sort आवेश काम करेगा; या आप एक ही बात को पूरा करने के लिए अपने उपरोक्त कार्य को पुनः लिख सकते हैं

ध्यान दें कि आपको तर्कों में मजबूत टाइपिंग का उपयोग करना होगा।

इसके अतिरिक्त, फ़ंक्शन का उपयोग बिल्कुल भी नहीं करना अच्छा है इसके बजाय, फ़ंक्शन ऑब्जेक्ट का उपयोग करें इनलाइनिंग से ये लाभ

 struct pkt_less { bool operator ()(pkt const& a, pkt const& b) const { if (a.alfa < b.alfa) return true; if (a.alfa > b.alfa) return false; if (ax < bx) return true; if (ax > bx) return false; return false; } }; // Usage: sort(wektor.begin(), wektor.end(), pkt_less()); 

सी ++ में, आप ऐसे प्रेक्टर्स का उपयोग कर सकते हैं जैसे boost::bind जो यह काम अच्छी तरह से करते हैं:

 #include <vector> #include <algorithm> struct pkt { double x; double y; double alfa; pkt(double x, double y, double alfa) :x(x), y(y), alfa(alfa) { } }; int main() { std::vector<pkt> p; p.push_back(pkt(10., 0., 20.)); p.push_back(pkt(10, 0., 30.)); p.push_back(pkt(5., 0., 40.)); std::sort(p.begin(), p.end(), boost::bind(&pkt::alfa, _1) < boost::bind(&pkt::alfa, _2) || boost::bind(&pkt::alfa, _1) == boost::bind(&pkt::alfa, _2) && boost::bind(&pkt::x, _1) < boost::bind(&pkt::x, _2)); } 

यदि आपको यह कई बार करना है, तो आप फ़ंक्शन ऑब्जेक्ट बनाकर समस्या का समाधान भी कर सकते हैं जो सदस्य पॉइंटर्स स्वीकार करता है और सॉर्ट करता है। आप इसे किसी भी वस्तु और सदस्यों के लिए पुन: उपयोग कर सकते हैं। सबसे पहले आप इसका उपयोग कैसे करते हैं:

 int main() { /* sorting a vector of pkt */ std::vector<pkt> p; p.push_back(pkt(10., 0., 20.)); p.push_back(pkt(5., 0., 40.)); std::sort(p.begin(), p.end(), make_cmp(&pkt::x, &pkt::y)); } 

यहाँ make_cmp के लिए कोड है इसे चीर करने के लिए स्वतंत्र महसूस करें ( boost::preprocessor का उपयोग करके):

 #include <boost/preprocessor/repetition.hpp> #include <boost/preprocessor/facilities/empty.hpp> // tweak this to increase the maximal field count #define CMP_MAX 10 #define TYPEDEF_print(z, n, unused) typedef M##n T::* m##n##_type; #define MEMBER_print(z, n, unused) m##n##_type m##n; #define CTORPARAMS_print(z, n, unused) m##n##_type m##n #define CTORINIT_print(z, n, unused) m##n(m##n) #define CMPIF_print(z, n, unused) \ if ((t0.*m##n) < (t1.*m##n)) return true; \ if ((t0.*m##n) > (t1.*m##n)) return false; \ #define PARAM_print(z, n, unused) M##n T::* m##n #define CMP_functor(z, n, unused) \ template <typename T \ BOOST_PP_ENUM_TRAILING_PARAMS(n, typename M)> \ struct cmp##n { \ BOOST_PP_REPEAT(n, TYPEDEF_print, ~) \ BOOST_PP_REPEAT(n, MEMBER_print, ~) \ cmp##n(BOOST_PP_ENUM(n, CTORPARAMS_print, ~)) \ BOOST_PP_IF(n, :, BOOST_PP_EMPTY()) \ BOOST_PP_ENUM(n, CTORINIT_print, ~) { } \ \ bool operator()(T const& t0, T const& t1) const { \ BOOST_PP_REPEAT(n, CMPIF_print, ~) \ return false; \ } \ }; \ \ template<typename T \ BOOST_PP_ENUM_TRAILING_PARAMS(n, typename M)> \ cmp##n<T BOOST_PP_ENUM_TRAILING_PARAMS(n, M)> \ make_cmp(BOOST_PP_ENUM(n, PARAM_print, ~)) \ { \ return cmp##n<T BOOST_PP_ENUM_TRAILING_PARAMS(n, M)>( \ BOOST_PP_ENUM_PARAMS(n, m)); \ } BOOST_PP_REPEAT(CMP_MAX, CMP_functor, ~) #undef TYPEDEF_print #undef MEMBER_print #undef CTORPARAMS_print #undef CTORINIT_print #undef CMPIF_print #undef PARAM_print #undef CMP_functor 

सी ++ 0x और लैम्ब्डास कोनराड के समाधान के साथ ऐसा दिखता है:

 sort(wektor.begin(), wektor.end(), [](pkt const& a, pkt const& b) { if (a.alfa < b.alfa) return true; if (a.alfa > b.alfa) return false; if (ax < bx) return true; if (ax > bx) return false; return false; });