Предположим, что у меня есть вектор размером 1000. Я хочу передать часть этого вектора в эту функцию:
template <typename T>
void insertion_sort (vector<T> &a) { // vector: pg 1012; & (reference): pg 383
for (long int i = 1; i < a.size(); i++) {
for (long int j = i; (j > 0) && (a[j] < a[j-1]); j--) {
std::swap(a[j], a[j-1]);
}
}
}
Скажем, я хочу отсортировать вектор из 100-1000. Перейду ли я в функцию следующим образом:
insertion_sort(&a[100]);
Я попытался использовать итератор, но функция не примет его. В этом случае, я боюсь, что при вызове size()
это будет 1000 вместо 900.
Каков наилучший способ сделать это?
Если вы не можете изменить предоставленную функцию, вы можете создать копию вектора, передать ее функции и скопировать обратно:
std::vector<int> v( 1000 );
auto it = v.begin();
std::advance( it, 100 );
std::vector<int> tmp( it, v.end() );
insertion_sort( tmp );
std::copy( tmp.begin(), tmp.end(), it );
или вы можете удалить первые 100 элементов, отсортировать свой вектор и вернуть их:
std::vector<int> v( 1000 );
auto it = v.begin();
std::advance( it, 100 );
std::vector<int> tmp( v.begin(), it );
v.erase( v.begin(), it );
insertion_sort( v );
v.insert( v.begin(), tmp.begin(), tmp.end() );
в противном случае функция, поскольку она в настоящее время написана, не обеспечивает способ сортировки вектора частично. Чтобы поддержать это, это должно быть написано, поскольку большинство стандартных алгоритмов - принятие диапазона на 2 итератора:
template< class RandomIt >
void sort( RandomIt first, RandomIt last );