Có một hàm vectơ tích hợp trong C ++ để đảo ngược một vectơ tại chỗ không?
Hay bạn chỉ phải làm bằng tay?
Có một hàm vectơ tích hợp trong C ++ để đảo ngược một vectơ tại chỗ không?
Hay bạn chỉ phải làm bằng tay?
Câu trả lời:
Có một chức năng std::reverse
trong algorithm
tiêu đề cho mục đích này.
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Tất cả các container cung cấp một cái nhìn đảo ngược về nội dung của họ với rbegin()
và rend()
. Hai hàm này trả về các lệnh gọi ngược lại , có thể được sử dụng như các hàm bình thường, nhưng nó sẽ trông giống như container 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(), "<-");
}
Ví dụ trực tiếp trên Ideone . Đầu ra:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
một vectơ 1000 phần tử, 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 phái cho rằng làm tê liệt trải nghiệm PC của tôi ngày hôm nay như cách đây 15 năm, với sự khác biệt là còn nhiều chu kỳ bị lãng phí, hàng tỷ người trong số họ.
print_range
là không chính xác: nó sẽ không hoạt động khi phạm vi trống được thông qua.
std::reverse(a.rbegin(), a.rend())
làm gì? ; ^)
Bạn có thể sử dụng std::reverse
như thế này
std::reverse(str.begin(), str.end());
Bạn cũng có thể sử dụng std::list
thay vì std::vector
. list
có một danh sách chức năng tích hợp :: đảo ngược để đảo ngược các phần tử.
Thông thường lý do bạn muốn đảo ngược vectơ là vì bạn điền nó bằng cách đẩy tất cả các mục vào cuối nhưng thực sự nhận được chúng theo thứ tự ngược lại. Trong trường hợp đó, bạn có thể đảo ngược container khi bạn đi bằng cách sử dụng deque
thay thế và đẩy chúng trực tiếp lên mặt trước. (Hoặc bạn có thể chèn các mục ở phía trước vector::insert()
thay vào đó, nhưng điều đó sẽ chậm khi có nhiều mục vì nó phải xáo trộn tất cả các mục khác cho mỗi lần chèn.) Vì vậy, trái ngược với:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Thay vào đó, bạn có thể làm:
std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_front(nextItem);
}
// No reverse needed - already in correct order
#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
}