Это больше похоже на дополнительный вопрос к Можно ли отправить часть вектора в виде вектора в функцию? , но это не так, и я не мог задать его там.
Я включил конкретный ответ, который интересен в моем случае:
Используйте итераторы в качестве параметров для функции, основанной на диапазоне, и передайте требуемый диапазон.Ваш код в функции становится
funcWithRange (v.cbegin () + 10, v.cbegin () + 50);с сигнатурой функции
void funcWithRange (std :: vector :: const_iterator first, std :: vector :: const_iterator last) Это можно обобщить, сделав этот шаблон функции с типом-членом вектора в качестве параметра шаблона,или еще дальше к любому контейнеру, поддерживающему этот тип итерации диапазона.Как отмечено в комментариях, есть много примеров этого паттерна.
std :: distance (first, last);вернет желаемый измененный размер.Я не думаю, что вы сможете приблизиться к выполнению ваших требований без создания физической копии.
Это все хорошо, но мне интересно, как "использовать" вектор (мой вектор называется "числами""в новой функции. Поскольку моя программа выглядит сейчас, я просто использую numbers [i], numbers [i + 1] и numbers.size (). Я не знаю, как это сделать, когда у меня есть два параметра.может использовать первый +? или что-то еще, но так как это рекурсивная функция, я хотел бы иметь возможность обрабатывать ее как вектор.
Мой второй вопрос: как написать сигнатуру функции, когда я использую пространство имен?std;? Обычно я просто обрезаю все до :: и ::, но на этот раз я вижу их дважды в первом и последнем.
Мне очень жаль спрашивать об этом здесь, когда это такпо аналогии с другими вопросами, на которые уже дан ответ. Сначала я попытался отправить электронное письмо тому, кто публикует ответ, и он рекомендовал мне опубликовать его здесь.
Обновление:
Спасибо за ответыЯ не могу понятьВы видите, как я могу использовать это.Не потому, что ваши ответы были не очень хорошими, а потому, что я не описал это достаточно хорошо.Также следует прикрепить код с помощью функции:
bool deeperLook (vector<int> numbers, int target)
{
for (int i = 0 ; i < numbers.size() ; i++)
{
if (numbers[i] == target)
{
return true;
}
if (numbers[i] < target)
{
deeperLook({numbers.cbegin() + i, numbers.cbegin() + numbers.size()} , target - numbers[i]);
}
while(numbers[i] == numbers[i+1])
{
i++;
}
}
return false;
}
Эта функция получит отсортированный вектор типа int (самый большой сначала), а затем попытается создать комбинацию чисел, которые складываются вместедостичь определенного числа (цель).bool deeperLook (vector numbers, int target) Как видите, функция хочет вектор как indata.Этот вектор отправляется в другую часть программы, а также он рекурсивный, поэтому мне нужно отправить его в виде indata.Как мне сделать это с итераторами?Код работает нормально, но он неэффективен для создания всего объема, так как на самом деле он является частью одного и того же вектора.
кто-то также сказал, что мне следует избегать "использования пространства имен std;".Зачем?Кажется, с ним гораздо проще написать код.