iteratory w tablicach

Julian_
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1703
0

Jaki jest standard oznaczania iteratorów tablicowych?

Mnie w LO na zajęciach programowania uczyli, że j jest zewnętrznym iteratorem, a i wewnętrzym czyli:

Kopiuj
for(j = 0; j < tab.length; i++){
    for(i = 0; i < tab[j].length; j++{
        tab[j][i];
    }
}

tymczasem jakiś ekspert z Norwegii mi napisał, że ma być na odwrót.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
2

Jeśli jest zwykła, pojedyncza pętla, to deklaruje się i jako iterator. Jeśli dochodzą kolejne zagnieżdżenia to deklaruje się j, k itd., według alfabetu. Nie jest to jakiś bardzo ważny standard, więc równie dobrze może być na odwrót. Choć przeważająca większość kodów (jaką widziałem) posiada i jako iterator głównej pętli.

J0
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie możesz wykorzystać interface interable?

I korzystać z for Each?

Bo ty jakieś stare nawyki przyprowadziłeś z R, a w obiektowych językach powinno się interface używać.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
1

@J0ras: uczyłeś się programowania od podstaw, czy od najtrudniejszych rzeczy?

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 337
1

Przyjęło się i tak byłem uczony, że "i" jest od index.

Od kiedy pracuję w zespole i dużo bardziej zależy na czytelności i zrozumieniu kodu, unikam stosowania skrótów i używam pełnych nazw. np. dużo łatwiej się czyta podwójnego fora po macierzy gdy zamiast "i", "j" stosuje się "row", "column".

KM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 473
0

tak mnie w C++ uczyli.

C++:

Kopiuj
for(auto row: tab) {
    for(auto elt: row) {
        elt;
    }
}

Albo, jak musisz mieć indeks, to tak:

Kopiuj
for(auto it = tab.begin(); it != tab.end(); it++) {
    for(auto jt = it->begin(); jt != it->end(); jt++) {
        *jt;
    }
}

Jest też std::for_each, ale jakoś nigdy nie nauczyłem się tego używać.

W C (albo w C++ jeśli musisz dla jakiejś przyczyny operować na czystych tablicach):

Kopiuj
for(tab_elt **it = tab; it != tab+tab_size; it++) {
    for(tab_elt *jt = *it; jt != *it+row_size; jt++) {
        *jt;
    }
}
Julian_
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1703
0

@kpmh a co jak potrzebuję iteratorów (wiersz i kolumna) żeby wywoływać metodę z ich użyciem?

KM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 473
0

Nie za bardzo rozumiem, o co pytasz :(

To są iteratory w każdym razie:

Kopiuj
for(auto it = tab.begin(); it != tab.end(); it++) {
    for(auto jt = it->begin(); jt != it->end(); jt++) {
        *jt;
    }
}

No i to std::for_each wywołuje funkcję do każdego iteratora.

Oczywiście to wszystko jest C++

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
1

@Julian_: wtedy iteratory nazywa się col i row - krótkie i od razu wiadomo czego dotyczą.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.