2009-03-27 21 views
26

मेरे पास तारों का एक गुच्छा है जिसे मुझे सॉर्ट करने की आवश्यकता है। मुझे लगता है कि एक std :: वेक्टर ऐसा करने का सबसे आसान तरीका होगा। हालांकि, मैंने पहले कभी वैक्टर का उपयोग नहीं किया है और इसलिए कुछ मदद चाहिए।मैं एक std :: वेक्टर <std::string> कैसे बना सकता हूं और फिर उन्हें सॉर्ट कर सकता हूं?

मुझे बस उन्हें अल्फान्यूमेरिक रूप से सॉर्ट करने की आवश्यकता है, कुछ खास नहीं। दरअसल, स्ट्रिंग :: तुलना फ़ंक्शन काम करेगा।

उसके बाद, मैं उनके माध्यम से कैसे हल कर सकता हूं यह सत्यापित करने के लिए कि मैं उनके माध्यम से कैसे पुन: प्रयास कर सकता हूं?

std::sort(data.begin(), data.end(), std::string::compare); 

for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i) 
{ 
    printf("%s\n", i.c_str); 
} 
+0

कृपया इस जवाब देखें: [बढ़ावा :: प्रकार] [1] [1]: http: // stackoverflow.com/a/14869307/1038233 – Magnetron

उत्तर

57

तुम बस

std::sort(data.begin(), data.end()); 

कर सकते हैं और यह आपके तार को सॉर्ट होगा। फिर जाँच है कि क्या वे आदेश

if(names.empty()) 
    return true; // empty vector sorted correctly 
for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
     j != names.end(); 
     ++i, ++j) 
    if(*i > *j) 
     return false; 
return true; // sort verified 

विशेष रूप से, std::string::compare एक तुलनित्र के रूप में इस्तेमाल नहीं किया जा सका में हैं उन के माध्यम से जाना है, क्योंकि यह क्या sort चाहता है यह करने के लिए काम नहीं करता: सच लौटें यदि पहला तर्क है दूसरे से कम, और अन्यथा झूठी वापसी। यदि आप ऊपर की तरह sort का उपयोग करते हैं, तो यह केवल operator< का उपयोग करेगा, जो वास्तव में करेगा (iee std::string इसे first.compare(second) < 0 वापस कर देता है)।

+7

बस मज़ेदार (और अवांछित) के लिए: यह जांचना कि वेक्टर सॉर्ट किया गया है, std :: adjacent_find (names.begin(), names.end(), std :: से अधिक को सरलीकृत किया जा सकता है()) == names.end() –

+0

@ एरिक मालेनफैंट - मैंने परीक्षण किया है, यह –

+0

@ एरिक मालेनफैंट काम करता है, अच्छी तरह से –

3

क्या सवाल ठीक है:

यहाँ मैं अब तक राशि है? ऐसा लगता है कि सब कुछ पहले से ही है।

हालांकि, आप शायद का उपयोग करना चाहिए std::cout << *i << std::endl;

  1. i, पुनरावर्तक कंटेनर में आंकड़ों के सूचक है == तो *
  2. c_str() की जरूरत है std::string के एक समारोह और एक चर नहीं है

आपके कोड में समस्याएं आपके प्रश्न से संबंधित नहीं हैं?

आप के लिए कुछ संकेत:

  • std::vector भी [] ऑपरेटर को ओवरराइड करता है, तो आप के बजाय इटरेटर परेशानी बचाने के लिए और एक सरणी की तरह उपयोग कर सकते हैं (0 से vector.size() को पुनरावृति)।
  • आप इसके बजाय std::set का उपयोग कर सकते हैं, जो स्वचालित रूप से सम्मिलन (बाइनरी पेड़) पर सॉर्ट कर रहा है, ताकि आप अतिरिक्त सॉर्टिंग को सहेज सकें।
  • एक functor का उपयोग करते हुए अपने उत्पादन और भी अधिक मज़ा बनाता है: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
2

तरह उपयोग के लिए:
std::sort या std::vector< std::string>::sort(..) विधि।
जांचने के लिए कि यह क्रमित है: जांच के लिए
उपयोग std::is_sorted क्रमबद्ध हो जाता है - http://www.sgi.com/tech/stl/is_sorted.html
या
std::adjacent_find(v.begin(), v.end(), std::greater<std::string>()) == v.end()

अपने मामले आप इस्तेमाल कर सकते हैं डिफ़ॉल्ट तुलनित्र

संपादित के लिए

:
std::is_sorted मानक एसएलएल समारोह नहीं है, यह एसजीआई एसटीएल कार्यान्वयन में परिभाषित किया गया है।
इस नोट के लिए धन्यवाद @ ब्रायन नील।

+1

किया गया है आपको एसटीएल पर जानकारी के लिए उस एसजीआई साइट पर भरोसा नहीं करना चाहिए। यह मानक की भविष्यवाणी करता है। is_sorted मानक नहीं है। इस महत्वपूर्ण नोट के लिए –

+0

संपादित, धन्यवाद। – bayda

+1

अगर मैं गलत हूं तो मुझे सही करें: is_sorted C++ 11 में जोड़ा गया है http://en.cppreference.com/w/cpp/algorithm/is_sorted – abe312

2

litb हमेशा के रूप में सही है।

मैं बस अधिक सामान्य बिंदु - कुछ भी को इंगित करना चाहता था जिसे < के साथ तुलना की जा सकती है std :: sort के साथ क्रमबद्ध किया जा सकता है। मैं कभी-कभी ऑपरेटर < सदस्य फ़ंक्शन को स्ट्रक्चर में घुमा दूंगा, बस मैं यह कर सकता हूं।

0

आप std::set का उपयोग कर सकते हैं, जो स्वाभाविक रूप से एक सॉर्टेड कंटेनर है। अनुसार क्रमबद्ध वेक्टर की जाँच करने के

if(vec.empty()) 
    return true; // empty vector is sorted correctly 
for(std::vector< std::string>::iterator i=vec.begin(), j=i+1; j != vec.end(); ++i, ++j) 
    if(*i > *j) return false; 
return true; // sort verified 

सी ++ 11 विधि::

using namespace std; // to avoid using std everywhere 
std::sort(data.begin(), data.end()); // this will sort the strings 

जाँच हो रही है वेक्टर हल कर रहा है या नहीं:

0

स्ट्रिंग छंटाई std::is_sorted(vec.begin(),vec.end())

अब मुद्रण अनुसार क्रमबद्ध वेक्टर:

for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i) 
{ 
    std::cout<< *i <<std::endl; 
} 
+0

मैंने कोडब्लॉक्स और ideone पर जांच की है और यह काम ठीक है। – abe312

+1

सी ++ 11 के बाद से, यदि वेक्टर सॉर्ट किया गया है तो जांच कर रहा है बस 'std :: is_sorted (vec.begin(), vec.end()) ' –

+0

आपको एसटीएल पर जानकारी के लिए उस एसजीआई साइट पर भरोसा नहीं करना चाहिए। यह मानक की भविष्यवाणी करता है। is_sorted मानक – abe312

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

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