मैं C ++ वेक्टर को कैसे रिवर्स करूं?


144

क्या एक वेक्टर को जगह में बदलने के लिए C ++ में एक अंतर्निहित वेक्टर फ़ंक्शन है?

या क्या आपको इसे मैन्युअल रूप से करना है?

जवाबों:


251

इस उद्देश्य के लिए हेडर std::reverseमें एक फ़ंक्शन है algorithm

#include <vector>
#include <algorithm>

int main() {
  std::vector<int> a;
  std::reverse(a.begin(), a.end());
  return 0;
}

क्या आप बता सकते हैं कि वेक्टर के वेक्टर को कैसे उल्टा किया जाए? मैं चाहता हूँ कि v [0] को v [v.size () - 1] और v [0] [i] तत्व के क्रम के साथ स्वैप किया जाए जैसा कि यह है। यह पंक्तियों के बदलते क्रम के समान है (यदि एक वेक्टर को मैट्रिक्स के रूप में देखा जाता है)। यदि एक वेक्टर को इस रूप में परिभाषित किया जाता है: वेक्टर <वेक्टर <int>> v; रिवर्स (v.begin (), v.end ()) इसे रिवर्स नहीं करता है। TIA!
विकास गोयल

@VikasGoel वास्तव में आपके द्वारा सुझाए गए स्निपेट को काम करना चाहिए। शायद कुछ और समस्या है?
Ivaylo Strandjev

45

सभी कंटेनरों एक उलट की पेशकश को देखने के साथ उनकी सामग्री के rbegin()और rend()। इन दोनों कार्यों लौट तो calles रिवर्स iterators , जो सामान्य लोगों की तरह इस्तेमाल किया जा सकता है, लेकिन कंटेनर की तरह वास्तव में उलट है यह दिखेगा।

#include <vector>
#include <iostream>

template<class InIt>
void print_range(InIt first, InIt last, char const* delim = "\n"){
  --last;
  for(; first != last; ++first){
    std::cout << *first << delim;
  }
  std::cout << *first;
}

int main(){
  int a[] = { 1, 2, 3, 4, 5 };
  std::vector<int> v(a, a+5);
  print_range(v.begin(), v.end(), "->");
  std::cout << "\n=============\n";
  print_range(v.rbegin(), v.rend(), "<-");
}

आइडोन पर लाइव उदाहरण । आउटपुट:

1->2->3->4->5
=============
5<-4<-3<-2<-1

1
हालांकि यह वेक्टर को जगह में उलट नहीं करता है। आप std :: वेक्टर <T> v2 (v1.rbegin (), v1.rend ()) के साथ एक नया वेक्टर बना सकते हैं; v2.swap (v1); जो प्रभावी रूप से आपके समाधान का उपयोग करेगा। मैं यह नहीं देखता कि यह std का उपयोग करने के लिए किसी भी तरह से अधिक सुरुचिपूर्ण या लाभप्रद है :: हालांकि रिवर्स।
CashCow

17
@ कैश: ठीक है, एक के लिए, यह एक सेशन नहीं है, यह ओ (1) है। पलट कर .. इतना नहीं। ज्यादातर समय, आपको वास्तव में एक उलट कंटेनर की आवश्यकता नहीं होती है, आपको केवल इसे उलट के रूप में देखने की आवश्यकता होती है। वास्तव में, मैं ऐसी स्थिति के बारे में नहीं सोच सकता, जहां आपको वास्तव में उल्टे कंटेनर की आवश्यकता हो, जिसे रिवर्स पुनरावृत्तियों के साथ हल नहीं किया जा सकता है।
Xeo

4
@CashCow: लालित्य हमेशा सही लालित्य नहीं होता है। मेरे पेशेवर करियर में ज्यादातर मामलों में, मुझे बस एक उलट दृश्य की आवश्यकता थी, लेकिन एक उलट वेक्टर नहीं। और उन सभी मामलों में, यदि आप अधिक प्रतियाँ बनाएँगे या क्रम बदलेंगे, तो प्रदर्शन पूरी तरह से बेकार होगा। क्या आप std::sort1000 तत्व वेक्टर भी करेंगे , यदि आपको अनिर्दिष्ट क्रम में शीर्ष -10 की आवश्यकता है, क्योंकि यह अधिक से अधिक सुरुचिपूर्ण है std::partition? यह विचार का विद्यालय है जो आज से 15 साल पहले मेरे पीसी के अनुभव को अपंग कर देता है, इस अंतर के साथ कि अभी और साइकिल बर्बाद हुई हैं, उनमें से अरबों।
सेबेस्टियन मच

print_rangeसही नहीं है: जब खाली रेंज पास हो जाएगी तो यह काम नहीं करेगा ।
नवाज

इतना बड़ा सवाल है, क्या करेंगे std::reverse(a.rbegin(), a.rend())? ; ^)
ऑरवेलोफाइल

23

आप std::reverseइस तरह का उपयोग कर सकते हैं

std::reverse(str.begin(), str.end());

5
यह आश्चर्यजनक है कि अंतर दो मिनट बनाता है।
jww

2

तुम भी उपयोग कर सकते हैं std::listके बजाय std::vectorlistएक अंतर्निहित फ़ंक्शन सूची है: तत्वों को उलटने के लिए रिवर्स


3
क्रम में कई तत्वों को सम्मिलित करने के एकमात्र विशिष्ट मामले में std :: सूची को वेक्टर से अधिक पसंद किया जाना चाहिए। सदिश का उपयोग करना :: वेक्टर पर सूची सिर्फ इसलिए कि आप अनुक्रम को उलट देंगे एक बुरा विचार प्रदर्शन-वार है।
eozd

0

अक्सर आप वेक्टर को उल्टा करना चाहते हैं इसका कारण यह है कि आप इसे अंत में सभी वस्तुओं को धक्का देकर भरते हैं लेकिन वास्तव में उन्हें रिवर्स ऑर्डर में प्राप्त कर रहे थे। उस स्थिति में आप कंटेनर को उल्टा कर सकते हैं जैसे कि आप एक dequeजगह का उपयोग करके जाते हैं और उन्हें सीधे सामने की तरफ धकेलते हैं। (या आप vector::insert()इसके बजाय सामने की ओर से आइटम सम्मिलित कर सकते हैं , लेकिन यह तब धीमा होगा जब बहुत सारी वस्तुएं होंगी क्योंकि इसमें हर प्रविष्टि के लिए अन्य सभी वस्तुओं को फेरबदल करना होगा।) ताकि विरोध किया जा सके:

std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());

आप इसके बजाय कर सकते हैं:

std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_front(nextItem);
}
// No reverse needed - already in correct order

0
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
    vector<int>v1;
    for(int i=0; i<5; i++)
        v1.push_back(i*2);
    for(int i=0; i<v1.size(); i++)
        cout<<v1[i];    //02468
    reverse(v1.begin(),v1.end());
    
    for(int i=0; i<v1.size(); i++)
        cout<<v1[i];   //86420
}

1
क्या इस आठ-वर्षीय प्रश्न को एक और डुप्लिकेट उत्तर की आवश्यकता है जो कुछ भी नहीं जोड़ता है?
ब्लास्टफर्नस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.