#include <vector>
#include <iostream>
#include <algorithm>
using std::vector;
using std::cout;
using std::endl;
using std::swap;
template <typename T> void rotate(T begin, T end, int k) {
if (k > 0) {
for (int i = 0; i < k; ++i) {
for (T j = end - 1; j != begin; --j) {
swap(*j, *(j-1));
}
}
}
if (k < 0) {
for (int i = 0; i > k; --i) {
for (T j = begin; j != end - 1; ++j) {
swap(*j, *(j+1));
}
}
}
}
// Test.
int main() {
vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
rotate(a.begin(), a.end(), 2);
for (vector<int>::iterator it = a.begin(); it != a.end(); ++it) {
cout << *it << " ";
}
cout << endl;
int b[] = {1,2,3,4};
rotate(b+0, b+4, -1);
for (int i = 0; i < 4; i++) {
cout << b[i] << " ";
}
cout << endl;
return 0;
}
четверг, 7 октября 2010 г.
Циклический сдвиг последовательности на заданное число позиций
Параметры begin и end могут быть либо указателями на ячейки массива, либо итераторами, указывающими на начало и конец последовательности. Параметр k может принимать отрицательные значения, что означает сдвиг в другом направлении. Продемонстрирована работа функции с обычным массивом и вектором.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий