Wytłumaczenie kilku kwestii w kodzie źródłowym set difference

0

Hej

Byłbym bardzo wdzięczny, gdyby ktoś mi wytłumaczył co się dzieje w kilku miejscach w kodzie źródłowym set_difference, bo potrzebuję coś takiego przepisać na SCILABA.

A więc kod źródłowy w C++

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_difference(InputIt1 first1, InputIt1 last1,
                        InputIt2 first2, InputIt2 last2,
                        OutputIt d_first)
{
    while (first1 != last1) {                                                                           //1.
        if (first2 == last2) return std::copy(first1, last1, d_first);                        //2.
 
        if (*first1 < *first2) {                                                                
            *d_first++ = *first1++;
        } else {
            if (! (*first2 < *first1)) {                                                                    //3.
                ++first1;                                                                                   //4.
            }
            ++first2;
        }
    }
    return d_first;
}

//1.Tutaj chodzi o to, że dopóki indeks first1 nie równa się last1, czy wartość first1 nie równa się wartości last1?
//2.Nie rozumiem tej kwesii, a mianowicie do czego wraca: std::copy(first1, last1, d_first);
//3.Tutaj to w ogóle nie wiem jak interpretować ten ! przed nawiasem
//4.Ogólnie to z tymi gwiazdkami oznacza tak, że z to jest indeks w wektorze, a bez to wartość?

Tu link do strony z której to wziąłem: https://en.cppreference.com/w/cpp/algorithm/set_difference

W sumie to byłbym wdzięczny, gdyby ogólnie ktoś mi wyjaśnił co się po kolei dzieje, bo w sumie ten algorytm nie jest jakiś długi, ale przez brak znajomości składni C++ wiele rzeczy mi się miesza.

Z góry dzięki :D

0
  1. Dopóki first1 jest różne od last1.
  2. std::copy zwraca iterator wyjścia, tuż za ostatnim skopiowanym elementem.
  3. !(*first2 < *first1) oznacza "nieprawda, że wartość pod iteratorem first2 jest mniejsze od wartości pod iteratorem first1. Krótko mowiąc '!' to znak zaprzeczenia warunku logicznego.
  4. Odwrotnie, z gwiazdką jest wartość znajdująca się pod iteratorem, natomiast bez, jest to po prostu iterator - możesz to traktować jako indeks, ale to duże uproszczenie i nie do końca prawda.
std::vector<int> vec(6);
auto it = std::begin(vec); //it wskazuje teraz na pierwszy element zakresu czyli vec[0] -co nie znaczy, że jego wartość to jeden czy zero - bo tak w C++ indeksujemy tablice/vectory/etc.
++it; // it wskazuje teraz na drugi element czyli vec[1].
auto val = *it; // val ma teraz wartość drugiego elementu vectora, czyli vec[1].
0

Ja dodam, że jeśli !(a < b) oraz !(b < a) to a == b (jeśli to są liczby, w innym wypadku nie musi być to prawda).

0

1.) iteracja po wszystkich elementach zbioru A

2.) jeśli zbiór A jest większy niż zbiór B to skopiuj nadmiarowe elementy ze zbioru A i zakończ.

3.) Do bloku else wchodzisz tylko wtedy gdy element z B jest mniejszy lub równy elementowi z A. Sprawdzasz kolejny warunek czy element z B nie jest mniejszy od elementu z A. Skoro element z B nie jest większy(sprawdziłeś to w if) i nie jest mniejszy niż element z A to znaczy, że warunek spełni się tylko wtedy gdy element z B jest równy elementowi z A

4.) Jeśli warunek 3 jest spełniony to przejdź do następnego elementu ze zbioru A (a następnie do kolejnego elementu z B - to wykona się bez względu na warunek 3)

1 użytkowników online, w tym zalogowanych: 0, gości: 1