Можем ли мы отправить часть вектора в качестве аргумента функции?
Я использую 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]);
Ответ 3
std::vector<char> b(100);
send(z,&b[0],b.size(),0);
Попробуйте это.
Прочтите это тоже.
Ответ 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));
означает, что вы передаете полный массив и диапазон, а затем можете применить вышеупомянутый трюк.