सी ++ मानक लाइब्रेरी एक तुलनात्मक को std::sort
पर पास करने की पेशकश करती है। हालांकि, मेरे पास मेरे कोड में कई मामले हैं जहां मैं f
फ़ंक्शन द्वारा T
ऑब्जेक्ट्स की सूची सॉर्ट करना चाहता हूं। इस तरह एक तुलनित्र एक वैध विकल्प होगा:std :: यूनरी मैपिंग द्वारा क्रमबद्ध
bool compare(const T& a, const T& b) {
return f(a) < f(b);
}
हालांकि यह इष्टतम नहीं है। f
मूल्यांकन करने में धीमा है लेकिन उसी कॉल के लिए उसी मान को उसी T
ऑब्जेक्ट के साथ वापस कर देगा। तो मैं क्या करना चाहूंगा f
एक बार सीमा में प्रत्येक ऑब्जेक्ट के लिए गणना करें और फिर उन परिणामों को क्रमबद्ध करने के लिए उनका उपयोग करें।
template <typename IterT, typename Transformation>
void sort(IterT left, IterT right, Transformation f) { /* ? */ }
इस तरह की है कि इस कॉल के बाद, अनुक्रम left
में सभी iter
के लिए f(*iter) <= f(*std::next(iter))
right
रहे हैं:
मेरा लक्ष्य इस समारोह (जो मैं ऐसा करने में सक्षम नहीं किया गया) लिखने के लिए है।
इसके अलावा, समारोह इन आवश्यकताओं को पूरा करना चाहिए:
- प्रकार
T
के किसी भी अतिरिक्त वस्तुओं का आवंटन नहीं करता है। f
का मूल्यांकनstd::distance(left, right)
कई बार मूल्यांकन करता है।- ओ (एन लॉग एन) की समग्र जटिलता को बनाए रखता है।
- std :: sort के संदर्भ में लागू किया जाना चाहिए। निस्संदेह मैं अपने विलय प्रकार को लागू करके इस समस्या को हल कर सकता हूं लेकिन यह कुछ है जिसे मैं टालना चाहता हूं।
(सी ++ 11 पसंद किया जाता है, सी ++ 14 भी ठीक है)
'f (ए) 'ऑब्जेक्ट' ए 'के परिणाम को संग्रहीत क्यों न करें और ऑब्जेक्ट की स्थिति में परिवर्तन होने पर केवल इसकी गणना करें? –
आप 'f'' के परिणामों को कैश करने के लिए "ज्ञापन" का उपयोग कर सकते हैं - उदा। एक 'unordered_map' का उपयोग कर। यह चीजों को जटिल बनाता है यदि आप मानचित्र कुंजी के रूप में उपयोग करने के लिए 'टी' प्रकार की वस्तुओं की प्रतिलिपि नहीं बना सकते हैं - क्या' टी' 'में डेटा का कुछ सबसेट है जिसका उपयोग 'f' करता है? वैकल्पिक रूप से, क्या आप वास्तविक वस्तुओं पर पॉइंटर्स की एक सरणी सॉर्ट कर सकते हैं? –
क्या 'f (* iter) 'केवल' * iter' या 'iter' पर निर्भर करता है? –