มีฟังก์ชั่นเวกเตอร์ในตัวใน C ++ เพื่อสลับเวกเตอร์เข้าที่หรือไม่?
หรือคุณต้องทำเอง
มีฟังก์ชั่นเวกเตอร์ในตัวใน C ++ เพื่อสลับเวกเตอร์เข้าที่หรือไม่?
หรือคุณต้องทำเอง
คำตอบ:
มีฟังก์ชันstd::reverse
ในalgorithm
ส่วนหัวสำหรับวัตถุประสงค์นี้
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
ภาชนะบรรจุทุกห้องมีตรงกันข้ามมุมมองของพวกเขาด้วยและ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
std::sort
เวกเตอร์องค์ประกอบ 1000 ถ้าคุณเพียงแค่ต้องด้านบน-10 ในการสั่งซื้อที่ไม่ระบุเพราะมันเป็นสง่ากว่าstd::partition
? นี่คือโรงเรียนแห่งความคิดที่ทำลายประสบการณ์พีซีของฉันในวันนี้เหมือนเมื่อ 15 ปีที่แล้วด้วยความแตกต่างที่วัฏจักรเสียอีกนับพันล้าน
print_range
ไม่ถูกต้อง: จะไม่ทำงานเมื่อผ่านช่วงที่ว่างเปล่า
std::reverse(a.rbegin(), a.rend())
ทำอย่างไร ; ^)
คุณสามารถใช้std::reverse
สิ่งนี้
std::reverse(str.begin(), str.end());
นอกจากนี้คุณยังสามารถใช้แทนstd::list
มีรายการฟังก์ชันในตัว:: ย้อนกลับสำหรับการย้อนกลับองค์ประกอบstd::vector
list
บ่อยครั้งที่เหตุผลที่คุณต้องการย้อนกลับเวกเตอร์เป็นเพราะคุณเติมโดยผลักรายการทั้งหมดในตอนท้าย แต่ได้รับจริง ๆ ในลำดับย้อนกลับ ในกรณีนี้คุณสามารถย้อนกลับภาชนะตามที่คุณไปโดยใช้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
#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
}