ฉันจะย้อนกลับเวกเตอร์ 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] ยังคงเป็นเช่นเดิม สิ่งนี้คล้ายกับการเปลี่ยนลำดับของแถว (หากดูเวกเตอร์เป็นเมทริกซ์) หากเวกเตอร์ถูกนิยามเป็น: vector <vector <int>> v; ย้อนกลับ (v.begin (), v.end ()) ไม่ย้อนกลับ TIA!
Vikas Goel

@VikasGoel ในความเป็นจริงตัวอย่างข้อมูลที่คุณแนะนำควรใช้งานได้ อาจจะมีปัญหาอื่นอีกบ้าง?
Ivaylo Strandjev

45

ภาชนะบรรจุทุกห้องมีตรงกันข้ามมุมมองของพวกเขาด้วยและrbegin() rend()ฟังก์ชั่นทั้งสองนี้ส่งคืนตัวเรียกย้อนกลับตัววนซ้ำซึ่งสามารถใช้เหมือนกับฟังก์ชันปกติได้ แต่จะดูเหมือนว่าคอนเทนเนอร์ถูกย้อนกลับจริง ๆ

#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(), "<-");
}

ตัวอย่างเช่นอยู่บน Ideone เอาท์พุท:

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

1
แต่นั่นไม่ได้ย้อนกลับเวกเตอร์ในสถานที่ คุณสามารถสร้างเวกเตอร์ใหม่ด้วย std :: vector <T> v2 (v1.rbegin (), v1.rend ()); v2.swap (v1); ซึ่งจะใช้โซลูชันของคุณอย่างมีประสิทธิภาพ ฉันไม่เห็นว่ามันจะสง่างามหรือเป็นประโยชน์ในการใช้ std: reverse
CashCow

17
@CashCow: สำหรับหนึ่งมันเป็นแบบไม่ op เป็น O (1) ย้อนกลับ .. ไม่มาก ส่วนใหญ่แล้วคุณไม่จำเป็นต้องมีตู้กลับด้าน แต่คุณจะต้องดูว่าตู้กลับด้านเท่านั้น ในความเป็นจริงฉันไม่สามารถนึกถึงสถานการณ์ที่คุณต้องการคอนเทนเนอร์ที่กลับด้านซึ่งไม่สามารถแก้ไขได้ด้วยตัววนกลับแบบย้อนกลับ
Xeo

4
@CashCow: ความสง่างามไม่ใช่ความสง่างามที่แท้จริงเสมอไป ในกรณีส่วนใหญ่ในอาชีพการงานของฉันฉันแค่ต้องการมุมมองกลับด้าน แต่ไม่ใช่เวกเตอร์ที่กลับด้าน และในทุกกรณีประสิทธิภาพจะไม่จำเป็นหากคุณสร้างสำเนาเพิ่มเติมหรือแปลงลำดับ คุณจะยังstd::sortเวกเตอร์องค์ประกอบ 1000 ถ้าคุณเพียงแค่ต้องด้านบน-10 ในการสั่งซื้อที่ไม่ระบุเพราะมันเป็นสง่ากว่าstd::partition? นี่คือโรงเรียนแห่งความคิดที่ทำลายประสบการณ์พีซีของฉันในวันนี้เหมือนเมื่อ 15 ปีที่แล้วด้วยความแตกต่างที่วัฏจักรเสียอีกนับพันล้าน
เซบาสเตียนมัค

print_rangeไม่ถูกต้อง: จะไม่ทำงานเมื่อผ่านช่วงที่ว่างเปล่า
นาวาซ

ดังนั้นคำถามใหญ่คือจะstd::reverse(a.rbegin(), a.rend())ทำอย่างไร ; ^)
Orwellophile

23

คุณสามารถใช้std::reverseสิ่งนี้

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

5
มันวิเศษมากที่ความต่างสองนาทีทำกัน
jww

2

นอกจากนี้คุณยังสามารถใช้แทนstd::list มีรายการฟังก์ชันในตัว:: ย้อนกลับสำหรับการย้อนกลับองค์ประกอบstd::vectorlist


3
รายการ std :: ควรจะต้องการมากกว่าเวกเตอร์ในกรณีเฉพาะของการแทรกองค์ประกอบจำนวนมากในตำแหน่งโดยพลการในลำดับ การใช้ std :: list บนเวกเตอร์เพียงเพราะคุณจะกลับลำดับเป็นความคิดที่ไม่ดี
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
คำถามอายุแปดขวบนี้ต้องการคำตอบที่ซ้ำกันซึ่งไม่ได้เพิ่มอะไรเลยหรือ
Blastfurnace
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.