2012-06-17 2 views
1

Я читаю какую-то книгу, и я столкнулся с фрагментом кода, который не был объяснен в книге, но имеет часть, которая очень сбивает меня с толку, смелая часть, и я хочу знать, что это о.Массив с двойными параметрами

void Set::intersection(const Set& s1, const Set& s2) 
{ 
    Set s; 
    s.arrayA = new double[ s1.sizeA<s2.sizeA ? s1.sizeA : s2.sizeA]; 
    int i, j, k; 
    while(i < s1.sizeA && j < s2.sizeA) 
     if(s1.arrayA[i] < s2.arrayA[j]) 
      i++; 
     else if (s1.arrayA[i] > s2.arrayA[j]) 
      j++; 
     else 
      s.arrayA[k++] = s1.arrayA[j++,i++]; // question is about this line 

    s.sizeA= k; 
    deleteA(); 
    copyA(s); 
} 

Что он делает, и почему в скобках [] есть два параметра? Заранее спасибо.

+1

Вы действительно получили это от книги ?? Это выглядит изворотливым - s.sizeA = k; но k не инициализируется, если вы ничего не опустили. – mathematician1975

+0

Посмотрите 5-ю строчку. @ mathematician1975 – Takarakaka

+0

Итак, каково значение k тогда? – mathematician1975

ответ

1

Два параметра в скобках - это выражение с использованием comma operator. Результатом такого выражения является результат последнего элемента (j++, i++ дает i, увеличиваемое на единицу, а j также увеличивается на единицу). Так s.arrayA[i++] = s1.arrayA[j++,i++]; действительно могут быть преобразованы в равной j++, s.arrayA[i++] = s1.arrayA[i++];

Этот код intersects наборам s1 и s2. Кажется, код показывает, что массивы (которые реализуют наборы) сортируются. Код идет по s1.arrayA и s2.arrayA, и если какой-либо элемент присутствует в обоих наборах, он помещает этот элемент в s.arrayA.

+0

Хорошо, но как это можно сделать? Мне это непонятно? Какой конструктор называется? И почему первый j ++ и только позже i ++? – Takarakaka

+0

Кажется, что 'Set s;' вызывает конструктор по умолчанию для 'Set'. – Ruben

+0

Ага, мне так ясно сейчас. Так почему я вообще отказался от своего первого оператора? – Takarakaka

Смежные вопросы