у меня два вектора
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;
}
Что я могу сделать, чтобы решить эту проблему?
Вы можете сохранить один итератор для каждого вектора и добавить из вектора (ов), которые не достигли своего итератора 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;
}
Зачем вам нужно создавать третий вектор, только никогда не использовать его, кроме его размера? На что вы можете ссылаться в любое время, используя ту же формулу, которая его объявила? Можно попробуй объяснить причину своей резиновой утке?