Передача части вектора функции в C ++

0

Предположим, что у меня есть вектор размером 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.

Каков наилучший способ сделать это?

  • 1
    Это неправильный путь в C ++, вы должны принимать не вектор, а итератор, представляющий диапазоны в векторе.
  • 0
    К сожалению, я не могу изменить код inserttion_sort выше.
Показать ещё 7 комментариев
Теги:
vector

1 ответ

2
Лучший ответ

Если вы не можете изменить предоставленную функцию, вы можете создать копию вектора, передать ее функции и скопировать обратно:

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 );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню