Как изменить алгоритм слияния, чтобы принимать разные аргументы в c ++? - PullRequest
0 голосов
/ 08 октября 2010

Исходный код, который я написал, использует следующие аргументы:

int m = размер отсортированного списка 1

int n = размер отсортированного списка 2

int A [] = отсортированный список 1

int B [] = отсортированный список 2

int C [] = объединенный список из 1 и 2

Меня попросили добавить этот код в существующий файл, который использует эти разные аргументы:

IntVectorIt start1

IntVectorIt end1

IntVectorIt start2

IntVectorIt end2

IntVectorIt start3

Здесь определены эти переменные (n - размер первого отсортированного массива, m - размер второго отсортированного массива):

typedef vector<int> IntVector;

typedef IntVector::iterator IntVectorIt;

IntVector Vector1(n);
IntVectorIt start1,end1,it1;
start1 = Vector1.begin();
end1 = Vector1.end();

IntVector Vector2(m);
IntVectorIt start2,end2,it2;
start2 = Vector2.begin();
end2 = Vector2.end();

IntVector Vector3(n+m);
IntVectorIt start3,end3,it3;
start3 = Vector3.begin();
end3 = Vector3.end();

//--The variables for my version of merge
IntVector MyVector(n+m);
IntVectorIt mystart,myend,myit;
mystart = MyVector.begin();
myend = MyVector.end();

Мой код слияния:

void mymerge(int m, int n, int A[], int B[], int C[])
{
  int i, j, k = 0;

  while (i < m && j < n)
  {
        if (A[i] <= B[j])
        {
              C[k] = A[i];
              i++;
        }

        else
        {
              C[k] = B[j];
              j++;
        }

        k++;
  }

  if (i < m)
  {
        for (int p = i; p < m; p++)
        {
              C[k] = A[p];
              k++;
        }
  } 

  else
  {
        for (int p = j; p < n; p++)
        {
              C[k] = B[p];
              k++;
        }

  }

}

Если бы кто-нибудь мог помочь мне понять, как я мог бы использовать эти итераторы в качестве аргументов, это помогло бы мне на тонну. Заранее спасибо.

1 Ответ

2 голосов
/ 08 октября 2010

Поскольку это звучит как домашнее задание, я не буду писать полное решение. Однако вот несколько советов по переносу mymerge:

Изменить подпись на

void mymerge(
    IntVectorIt aStart,
    IntVectorIt aEnd,
    IntVectorIt bStart, 
    IntVectorIt bEnd,
    IntVectorIt cStart, 
    IntVectorIt cEnd
    );

Измените текущие индексы на итераторы, например,

IntVectorIt i = aStart;

Измените условие остановки цикла, чтобы использовать итераторы, например

i != aEnd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...