Anas Zahed Ответов: 2

Помощь с векторами смешивания C++


#include<iostream>
#include<vector>

using namespace std;

vector<int> mix(vector<int> v1, vector<int> v2)
{
    vector<int> newVec{v1.at(0), v2.at(0)};
        if(v2.size()+2>1){
            vector<int> restV1(v1.begin() + 1, v1.end());
            vector<int> restV2(v2.begin() + 1, v2.end());
                vector<int> call_vec = mix(restV1, restV2);
                newVec.reserve(newVec.size());

                 vector<int> newVeca=newVec;
                 for(size_t i(0);i<newVeca.size();i++){
                    cout<< newVeca[i]<< "|";
                 }
             }
        return newVec;
}

int main()
{
    vector<int> v1{1,2,3,4};
    vector<int> v2{5,6,7,8};

    mix(v1,v2);

    return 0;
}


Что я уже пробовал:

Эй, все до единого !!!
У меня есть это домашнее задание, что нам нужно сделать его без петли, и у меня есть проблемы с пониманием, буксирная вещь здесь
1 - Почему new-Vec находится не в правильном порядке (это из-за рекурсии или чего-то еще, что я сделал неправильно в своем коде )
2 - я не смог получить последнее буксирное целое число в add the new integer
каждый раз, когда я пытаюсь увеличить размер в if ( if(v2.size()+2>1)), я получаю эту ошибку:
(terminate вызывается после создания экземпляра 'std::out_of_range'
что(): вектор::_M_range_check: __Н (который 0) &ГТ;= это-&ГТ;размер() (который является 0))



Напишите функцию, которая получает два вектора значений int в качестве параметров и возвращает вектор значений int в качестве возвращаемого значения. Возвращаемый вектор всегда должен содержать попеременно значение из первого параметра и значение из второго параметра (начиная с первого значения из первого параметра). Относительный порядок значений в результирующем векторе должен быть таким же, как и во входных векторах. Если два входных вектора имеют разную длину, то остальная часть более длинного вектора остается неизменной

Параметр: Ergebnis:
{1,2,3} {4,5,6} {1,4,2,5,3,6}
{1,2,3,4,5,6} {7,8,9} {1,7,2,8,3,9,4,5,6}

2 Ответов

Рейтинг:
1

Anas Zahed

спасибо
сделал это


#include<iostream>
#include<vector>

using namespace std;

vector<int> mix(vector<int> &v1, vector<int> &v2)
{            vector<int> newVec{v1.at(0), v2.at(0)};

        if(v1.size()>1){
            vector<int> restV1(v1.begin() + 1, v1.end());
            vector<int> restV2(v2.begin() + 1, v2.end());
                vector<int> call_vec = mix(restV1, restV2);

        newVec.insert(newVec.end(), call_vec.begin(), call_vec.end());
}

 return newVec;


    }




int main(){

    vector<int> v1{1,2,3,4};
    vector<int> v2{5,6,7,8};

    vector<int> v =  mix(v1,v2);


                 for(size_t i(0);i<v.size();i++){
                    cout<< v[i]<< "|";

        }
}


CPallini

Требуется ли рекурсия? Я думаю, что итеративный подход был бы лучше.

Anas Zahed

Япончик !! это должно быть в реурионе

Рейтинг:
0

KarstenK

этот

if(v2.size()+2>1)
это всегда правда. Так что это проблема. Вы не используете call_vec? Разве это не результат?

Сделайте некоторые выходные данные и используйте отладчик.

если это возможно, используйте вызов по ссылке с 6-оператором:
vector<int> mix(vector<int> &v1, vector<int> &v2)
Этот aovid создает новые экземпляры в вызове функции. (Используйте команды отладчика "шаг в", чтобы доказать это9


Anas Zahed

я использовал call_vec только для создания цикла, я думал, что результат находится в newVec, но вы правы

когда я использую if(v2.size()>1) код не даст мне никакой ошибки , но результат выглядит так: 3/7/2/6/1/5| так что он пропустил числа и его перевернули

KarstenK

Как я уже писал: используйте отладчик. Первое, что идет не так, - это ваш следующий шаг к разрешению.

Я думаю, что ваш реальный результат-это newVec и добавление call_vec в конце.