Есть ли встроенная векторная функция в С++ для изменения вектора на месте?
Или вам просто нужно сделать это вручную?
Есть ли встроенная векторная функция в С++ для изменения вектора на месте?
Или вам просто нужно сделать это вручную?
Для этой цели в заголовке algorithm
есть функция std::reverse
.
#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::reverse
, как этот
std::reverse(str.begin(), str.end());
Вы также можете использовать std::list
вместо std::vector
. list
имеет встроенную функцию list:: reverse для изменения элементов.
Вы можете использовать эту логику, если вы не хотите использовать встроенный метод reverse():
vector<string>::iterator itr;
vector<string>::iterator it;
for (itr = v.begin(), it = v.end()-1; itr!=v.end(), \
it!=(v.begin()+(v.size()-1)/2); \
++itr, --it)
{
string temp;
temp = *itr;
*itr = *it;
*it = temp;
}