Можем ли мы отправить часть вектора в качестве аргумента функции?

Я использую vector в С++-программе (и я новичок).
И мне нужно отправить часть vector в функцию.

Если это было c, мне нужно сделать это (с массивами):

int arr[5] = {1, 2, 3, 4, 5};
func(arr+2);    //to send part array {3, 4, 5}

Есть ли способ, кроме создания нового vector с последней частью?

Ответ 1

Общим подходом является передача диапазонов итераторов. Это будет работать со всеми типами диапазонов, включая те, которые относятся к стандартным библиотечным контейнерам и простым массивам:

template <typename Iterator>
void func(Iterator start, Iterator end) 
{
  for (Iterator it = start; it !=end; ++it)
  {
     // do something
  } 
}

затем

std::vector<int> v = ...;
func(v.begin()+2, v.end());

int arr[5] = {1, 2, 3, 4, 5};
func(arr+2, arr+5);

Примечание. Хотя функция работает для всех типов диапазонов, не все типы итераторов поддерживают приращение через operator+, используемое в v.begin()+2. Для альтернатив посмотрите std::advance и std::next.

Ответ 2

В общем случае вы можете отправлять итераторы.

static const int n[] = {1,2,3,4,5};
vector <int> vec;
copy (n, n + (sizeof (n) / sizeof (n[0])), back_inserter (vec));

vector <int>::iterator itStart = vec.begin();
++itStart; // points to `2`
vector <int>::iterator itEnd = itStart;
advance (itEnd,2); // points to 4

func (itStart, itEnd);

Это будет работать не только с vector s. Однако, поскольку a vector имеет гарантированное непрерывное хранилище, если vector не перераспределяет, вы можете отправлять адреса элементов:

func (&vec[1], &vec[3]);

Ответ 4

Как уже говорили некоторые другие, вы можете использовать итераторы для этого. Вам нужно будет передать начало последовательности и конец последовательности вашей рабочей функции.

Если вам нужна большая гибкость, вы должны взглянуть на slice. С помощью slice вы можете, например, получить каждую n-ю запись вектора.

Ответ 5

Я тоже придерживался той же проблемы. Я нашел один действительно хороший трюк. Предположим, вы хотите найти минимум в диапазоне от L до R (оба включительно) arr, тогда вы можете сделать что-то вроде этого:

vector<int>arr = {4,5,1,3,7};

int minVal = *min_element(begin(arr)+L,begin(arr)+(R+1));

означает, что вы передаете полный массив и диапазон, а затем можете применить вышеупомянутый трюк.