2012-01-16 124 views

Trả lời

193

Có chức năng std::reverse trong tiêu đề algorithm cho mục đích này.

#include <vector> 
#include <algorithm> 

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

Tôi vừa thêm không gian tên 'std', hy vọng bạn không nhớ;) ... – MartinStettner

+5

Không, cảm ơn. Chỉ cần nhận thấy các chỉnh sửa của bạn và chúng hoàn toàn đầy đủ và chính xác. –

+0

Bạn có thể giải thích cách đảo ngược vec tơ vectơ không? Tôi muốn v [0] được đổi chỗ với v [v.size() - 1] và thứ tự của v [0] [i] vẫn giữ nguyên. Điều này tương tự như việc thay đổi thứ tự các hàng (nếu một véc tơ được xem như một Ma trận). Nếu một vectơ được định nghĩa là: vector > v; đảo ngược (v.begin(), v.end()) không đảo ngược nó. TIA! –

16

Bạn có thể sử dụng std::reverse như thế này

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

Tất cả container cung cấp một đảo ngược xem nội dung của họ với rbegin()rend(). Hai hàm này trả về các số gọi ngược trình lặp ngược, có thể được sử dụng như các trình duyệt thông thường, nhưng có vẻ như vùng chứa thực sự bị đảo ngược.

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

Live example on Ideone. Đầu ra:

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

không đảo ngược vectơ tại chỗ. Bạn có thể tạo một vectơ mới với std :: vector v2 (v1.rbegin(), v1.rend()); v2.swap (v1); mà có hiệu quả sẽ sử dụng giải pháp của bạn. Tôi không thấy làm thế nào nó là thanh lịch hơn hoặc thuận lợi trong bất kỳ cách nào để sử dụng std :: ngược lại mặc dù. – CashCow

+11

@CashCow: Vâng, đối với một, nó là một no-op, đó là O (1). Đảo ngược .. không quá nhiều. Hầu hết thời gian, bạn không thực sự cần một container ngược, bạn chỉ cần * xem * nó như đảo ngược. Trong thực tế, tôi không thể nghĩ về một tình huống mà bạn thực sự cần một container đảo ngược mà không thể được giải quyết với các trình lặp ngược lại. – Xeo

+3

@CashCow: Elegance không phải lúc nào cũng là sự sang trọng thực sự. Trong hầu hết các trường hợp trong sự nghiệp chuyên nghiệp của tôi, tôi chỉ cần một cái nhìn đảo ngược, nhưng không phải là một vectơ đảo ngược. Và trong tất cả những trường hợp đó, hiệu suất sẽ hoàn toàn không cần thiết nếu bạn tạo nhiều bản sao hơn hoặc biến đổi thứ tự. Bạn cũng sẽ 'std :: sort' một vector phần tử 1000, nếu bạn chỉ cần top-10 theo thứ tự không xác định, bởi vì nó thanh lịch hơn' std :: partition'? Đây là trường tư tưởng làm tê liệt kinh nghiệm máy tính của tôi ngày nay như nó đã làm 15 năm trước, với sự khác biệt mà chu kỳ nhiều hơn là lãng phí, hàng tỷ người trong số họ. –

1

Bạn cũng có thể sử dụng std::list thay vì std::vector. list có chức năng tích hợp list::reverse để đảo ngược các phần tử.

Các vấn đề liên quan