Как чередовать два вектора разных размеров?

у меня два вектора

vector<int> first_v = {1, 4, 9, 16, 8, 56};
vector<int> second_v = {20, 30};

И цель состоит в том, чтобы объединить эти векторы в определенном порядке (в основном программа сначала печатает одно значение вектора first_v, а затем одно значение вектора second_v):

Expected Output:
1 20 4 30 9 16 8 56

Я очень близок к решению, но проблема в том, что если один вектор короче другого, программа напечатает «0».

Problem output:
1 20 4 30 9 0 16 0

Вот код, который я пытался решить эту проблему

merge_vect(first_v, second_v);

vector<int> merge_vect(const vector<int> & a, const vector<int> & b){
  vector<int> vec(a.size() + b.size());

  for (int i = 0; i < vec.size(); i++){
    cout << a[i] << " ";
    cout << b[i] << " ";
  }  
  return vec;
}

Что я могу сделать, чтобы решить эту проблему?

Зачем вам нужно создавать третий вектор, только никогда не использовать его, кроме его размера? На что вы можете ссылаться в любое время, используя ту же формулу, которая его объявила? Можно попробуй объяснить причину своей резиновой утке?

Sam Varshavchik 09.04.2022 22:05
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сохранить один итератор для каждого вектора и добавить из вектора (ов), которые не достигли своего итератора end().

Пример:

#include <iostream>
#include <vector>

std::vector<int> merge_vect(const std::vector<int>& avec,
                            const std::vector<int>& bvec)
{
    std::vector<int> result;
    result.reserve(avec.size() + bvec.size());

    for(auto ait = avec.begin(), bit = bvec.begin();
        ait != avec.end() || bit != bvec.end();) 
    {
        if(ait != avec.end()) result.push_back(*ait++);
        if(bit != bvec.end()) result.push_back(*bit++);
    }

    return result;
}

int main() {
    std::vector<int> first_v = {1, 4, 9, 16, 8, 56};
    std::vector<int> second_v = {20, 30};

    auto result = merge_vect(first_v, second_v);

    for(auto val : result) std::cout << val << ' ';
}

Выход:

1 20 4 30 9 16 8 56 

Возможная оптимизация может копировать из обоих векторов до тех пор, пока в обоих есть элементы, а затем копировать остальные из большего вектора за один раз:

std::vector<int> merge_vect(const std::vector<int>& avec,
                            const std::vector<int>& bvec)
{
    std::vector<int> result;
    result.reserve(avec.size() + bvec.size());
    auto ait = avec.begin(), bit = bvec.begin();
    
    // copy while both have more elements:
    for(; ait != avec.end() && bit != bvec.end(); ++ait, ++bit) {
        result.push_back(*ait);
        result.push_back(*bit);
    }

    // copy the rest
    if(ait != avec.end()) result.insert(result.end(), ait, avec.end());
    else if(bit != bvec.end()) result.insert(result.end(), bit, bvec.end());

    return result;
}

Другие вопросы по теме