Вероятно, вам следует вообще избегать цикла:
void combine(vector<int> const& A, vector<int> const& B, vector<int> & R) {
R.resize( A.size() + B.size() );
std::copy( A.begin(), A.end(), R.begin() );
std::copy( B.begin(), B.end(), R.begin()+A.size() );
std::sort( R.begin(), R.end() );
for ( int i = 0; i < R.size(); ++i )
{
cout << "L3[" << i << "] = " << R[i] << endl;
}
}
Это неоптимально, так как вы сначала копируете, а затем заказываете, но для небольшого размера это никак не повлияет.
По фактическим проблемам с вашим кодом: старайтесь избегать передачи по значению, используйте resize вместо нескольких push_back()
, чтобы исправить размер (обратите внимание, что если аргумент R
для вашей функции был непустым вектором тогда окончательный размер будет больше, чем вы хотите). Попробуйте использовать возвращаемое значение вместо ссылочного аргумента --easier для чтения. Вы зациклились, пока первый из счетчиков не достиг конца, но остальные элементы остались в другом контейнере без копирования.
Ручная реализация с использованием итераторов также будет проще:
typedef std::vector<int> vector_t;
vector_t combine( vector_t const & a, vector_t const & b ) {
vector_t r( a.size() + b.size() ); // [*]
vector_t::const_iterator ita = a.begin(), enda = a.end();
vector_t::const_iterator itb = b.begin(), endb = b.end();
vector_t::iterator itr = r.begin();
while ( ita != enda && itb != endb ) {
if ( *ita < *itb )
*itr++ = *ita++;
else
*itr++ = *itb++;
}
if ( ita != enda )
std::copy( ita, enda, itr );
else
std::copy( itb, endb, itr );
return r;
}