2017-12-10 98 views
5

मेरे पास एक वेक्टर है जिसमें सकारात्मक पूर्णांक और -1 शामिल हैं। मेरी समस्या यह है कि मैं वेक्टर को सॉर्ट करना चाहता हूं लेकिन को std::sort का उपयोग करके स्पर्श न करें (मुझे इसे हल करने के अन्य दृष्टिकोण पता हैं)।std :: वेक्टर को कैसे क्रमबद्ध करें लेकिन std :: sort का उपयोग करके विशिष्ट तत्वों को परिवर्तित न करें?

उदाहरण के लिए:

इनपुट: [-1, 150, 190, 170, -1, -1, 160, 180]

आउटपुट: [-1, 150, 160, 170 , -1, -1, 180, 190]

यह मेरा विचार इसे हल करने के लिए है, लेकिन यह काम नहीं किया:

sort(myVector.begin(), myVector.end(), [&](const int& a,const int& b)->bool { 
     if (a == -1 || b == -1) 
      return &a < &b; 
     return a < b; 
    }); 

मेरा आउटपुट है: [-1, 150, 170, 1 9 0, -1, -1, 160, 180]

आउटपुट होना चाहिए: [-1, 150, 160, 170, -1, -1 , 180, 1 9 0]

क्या std::sort का उपयोग करके इसे हल करने का कोई विचार है?

+5

मुझे नहीं लगता कि यह सीधे संभव है: वैकल्पिक,, -1 रों के स्थानों को निकालने मिटा सभी -1 रों वेक्टर सॉर्ट और पुन: लगाएं जहां उपयुक्त हो रहा है। 'Std :: sort' फ़ंक्शन एक सीमा पर चल रहा है और अस्थायी रूप से तत्वों को निकालने का तरीका नहीं है और बाद में उन्हें उसी स्थिति में वापस जोड़ना है (बेशक आप इसे कई चरणों में कर सकते हैं लेकिन मेरा मानना ​​है कि यह नहीं है आप पूछ रही हो)। मैं "std :: sort'" कस्टमाइज़ "का मतलब भी प्राप्त नहीं करता हूं। और यह भी कि कैसे 'std :: sort' works कार्यान्वयन को AFAIK परिभाषित किया गया है ताकि आप ऑर्डरिंग के तरीके के बारे में कोई अनुमान नहीं लगा सकें। – Yashas

+0

@Yashas मेरी अंग्रेजी के लिए खेद है, आप सही हैं, मैंने अपना प्रश्न संपादित किया –

+2

'-1' के वेक्टर में स्थान निकालें, सभी '-1' मिटाएं, क्रमबद्ध करें और उन्हें वापस पाइप करें। – Ron

उत्तर

3

std::sort ऐसा नहीं कर सकता। यह एक सख्त, कमजोर आदेश के अनुसार तत्वों की एक श्रृंखला का प्रकार है। आपके द्वारा परिभाषित ऑर्डर strict-weak नहीं है। और एक आदेश को परिभाषित करने का कोई तरीका नहीं है जो सख्त-कमज़ोर है, जैसे कि कुछ मूल्य उनके वर्तमान पदों में रहते हैं। और इसलिए, यदि आप इस आदेश के साथ sort का उपयोग करने का प्रयास करते हैं, तो आपको अपरिभाषित व्यवहार मिलता है।

तो आपको अपना खुद का सॉर्टिंग फ़ंक्शन लिखना होगा। या आप -1 को हटा सकते हैं (अपनी स्थिति रिकॉर्ड कर रहे हैं), सूची को सॉर्ट करें, फिर उन्हें दोबारा डालें।

0

यह std::sort अकेले उपयोग नहीं किया जा सकता है।

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
    std::vector<int> v{ -1, 150, 190, 170, -1, -1, 160, 180 }; 
    std::vector<int> vtemp; 
    auto it = v.begin(); 
    while ((it = std::find_if(it, v.end(), [](int x){ return x == -1; })) != v.end()) { 
     vtemp.push_back(std::distance(v.begin(), it)); 
     it++; 
    } 
    v.erase(std::remove(v.begin(), v.end(), -1), v.end()); 
    std::sort(v.begin(), v.end()); 
    for (auto el : vtemp){ 
     v.insert(v.begin() + el, -1); 
    } 
} 
+0

गति में सुधार करने के लिए स्पष्ट अनुकूलन हैं (-1s को पुन: सम्मिलित करने पर esp) लेकिन यह एक उचित दृष्टिकोण है। आप वेक्टर में -1 के पदों को संग्रहीत करके अतिरिक्त स्थान के बिना भी कर सकते हैं, क्योंकि आप उन्हें बाहर निकाल देते हैं। – davidbak

संबंधित मुद्दे