C ++ 'da bir vektörü yerinde ters çevirmek için yerleşik bir vektör işlevi var mı?
Yoksa sadece manuel olarak mı yapmanız gerekiyor?
C ++ 'da bir vektörü yerinde ters çevirmek için yerleşik bir vektör işlevi var mı?
Yoksa sadece manuel olarak mı yapmanız gerekiyor?
Yanıtlar:
Bir işlev var std::reverse
içinde algorithm
bu amaçla başlığındaki.
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Tüm kaplar , içeriklerinin ve ile ters bir görünümünü sunar . Bu iki işlev, sözde ters yineleyiciler döndürür , bunlar normal işlevler gibi kullanılabilir, ancak kap aslında tersine çevrilmiş gibi görünecektir.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'da canlı örnek . Çıktı:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
1000 eleman vektör, bu daha şık olduğu için sadece, top-10 belirtilmemiş sırayla gerekirse std::partition
? Bu, milyarlarca döngünün boşa gitmesi farkıyla, 15 yıl önce olduğu gibi bugün de benim PC deneyimimi sakat bırakan düşünce okulu.
print_range
doğru değil: boş aralık geçildiğinde çalışmayacaktır.
std::reverse(a.rbegin(), a.rend())
? ; ^)
Sen kullanabilirsiniz std::reverse
Böyle
std::reverse(str.begin(), str.end());
Bunun std::list
yerine de kullanabilirsiniz std::vector
. list
yerleşik bir fonksiyon listesine sahiptir :: ters elemanlar için ters.
Çoğu zaman vektörü tersine çevirmek istemenizin nedeni, sonunda tüm öğeleri iterek doldurmanız, ancak aslında onları ters sırada alıyor olmanızdır. Bu durumda, konteyneri ilerledikçe deque
bunun yerine a kullanarak ve doğrudan öne iterek ters çevirebilirsiniz . (Veya vector::insert()
bunun yerine öğeleri ön tarafa yerleştirebilirsiniz , ancak bu, her ekleme için diğer tüm öğeleri karıştırması gerektiğinden çok sayıda öğe olduğunda yavaş olacaktır.)
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Bunun yerine şunları yapabilirsiniz:
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
}