Czy da radę wypisać X element za pomocą iteratora ?

0

czy za pomocą iteratora da radę wypisać np 2,4,5,10 element ?

chodzi mi o coś takiego

int main()
{
    string tab[]={"Napis 1", "Napis 2", "Napis 3"};

    unsigned int element;
    cin >> element;

    for(unsigned int i=0; i<tab->size(); ++i){
        if(i==element){
            cout << tab[element] << endl;
        }
    }

    return 0;
}

a jak uzyskać to samo za pomocą iteratora ? Niżej NIEPOPRAWNY kod i nie wiem jak to ugryźć

void data(int number){
        std::list<string>::iterator it;

        for(it = varItem.begin(); it != varItem.end(); ++it){
            cout << it->at(number);
        }
    }
2

Ale to chcesz wypisywać element drugi, czwarty, piąty i dziesiąty naraz, czy tylko jeden z nich? Jak tylko jeden, to po co ci tam pętla? A jak pętla zbędna, to po co iteratory? Iterator służy do iteracji, a nie wybierania konkretnego elementu.

A jeśli już masz listę - n-ty element uzyskasz przez

auto it = varItem.begin();
std::advance(it, n);
std::cout << *it;
0
enedil napisał(a):

Ale to chcesz wypisywać element drugi, czwarty, piąty i dziesiąty naraz, czy tylko jeden z nich? Jak tylko jeden, to po co ci tam pętla? A jak pętla zbędna, to po co iteratory? Iterator służy do iteracji, a

jeden z nich. Ale dlaczego za pomocą iteratora nie da się wybrać jednego konkretnego elementu ? Coś kojarzę, że przy pomocy innych iteratorów wypisywałem jeden konkretny element który był potrzebny

2
zkubinski napisał(a):
enedil napisał(a):

Ale to chcesz wypisywać element drugi, czwarty, piąty i dziesiąty naraz, czy tylko jeden z nich? Jak tylko jeden, to po co ci tam pętla? A jak pętla zbędna, to po co iteratory? Iterator służy do iteracji, a

jeden z nich. Ale dlaczego za pomocą iteratora nie da się wybrać jednego konkretnego elementu ? Coś kojarzę, że przy pomocy innych iteratorów wypisywałem jeden konkretny element który był potrzebny

Wiele rzeczy można zrealizować, ale przeczy to celowi interatorów. Jak widzisz wyżej, użyłem iteratora tylko i wyłącznie do uzyskania dostępu do konkretnego elementu. Gdyby to był wektor a nie lista, bym w życiu tak nie zrobił, tylko użył notacji tablicowej (tzn myvector[n]).

0
enedil napisał(a):

Gdyby to był wektor a nie lista, bym w życiu tak nie zrobił, tylko użył notacji tablicowej (tzn myvector[n]).

no dobra, jeszcze trochę pomarudzę. Czemu na liście nie można użyć zapisu tablicowego ?

1
zkubinski napisał(a):
enedil napisał(a):

Gdyby to był wektor a nie lista, bym w życiu tak nie zrobił, tylko użył notacji tablicowej (tzn myvector[n]).

no dobra, jeszcze trochę pomarudzę. Czemu na liście nie można wykonać zapisu tablicowego ?

Do listy możesz bez większego problemu wstawiać elementy do środka listy, więc coś takiego jak stałość indeksów (tzn, że element pod indeksem 5 znaczy w większości przypadków ten sam element) nie ma sensu, i większość algorytmów co się już decyduje na użycie list nigdy nie korzysta z indeksacji na listach.

0
enedil napisał(a):

nigdy nie korzysta z indeksacji na listach.

czyli rozumiem, że chodzi o użycie operatora [ ] ?

1
zkubinski napisał(a):
enedil napisał(a):

Ale to chcesz wypisywać element drugi, czwarty, piąty i dziesiąty naraz, czy tylko jeden z nich? Jak tylko jeden, to po co ci tam pętla? A jak pętla zbędna, to po co iteratory? Iterator służy do iteracji, a

jeden z nich. Ale dlaczego za pomocą iteratora nie da się wybrać jednego konkretnego elementu ? Coś kojarzę, że przy pomocy innych iteratorów wypisywałem jeden konkretny element który był potrzebny

Czy da się za pomocą tarnika wbijać gwożdzie
Praktykant stolarski, który zna tylko tarnik.

masz radykalny brak podstaw co do struktur danych, i wszystko ci się kojarzy z jednym (tym, co przypadkowo nawinęło się w jakimś artykule, choć nie podejrzewam ciebie o systematyczne czytanie pełnego ani jednego artykułu do końca i ze zrozumieniem)

Jesli chcesz wypisac elementy nr N,M i O to nalezy podejść inaczej niż z tarni... iteratorem, to jest oczywiste dla każdego kto ma ogląd tematów (nawet nie wymaga głębokiej wiedzy). BTW było ci tłumaczone, ze nie ma czegoś takiego jak iterator w oderwaniu od struktury danych

1
zkubinski napisał(a):

czy za pomocą iteratora da radę wypisać np 2,4,5,10 element ?
[cut]
a jak uzyskać to samo za pomocą iteratora ? Niżej NIEPOPRAWNY kod i nie wiem jak to ugryźć

void data(int number){
        std::list<string>::iterator it;

        for(it = varItem.begin(); it != varItem.end(); ++it){
            cout << it->at(number);
        }
    }

Jest taka dość dobra rada dla początkujących programistów.

Jeśli zastanawiasz się którego z sekwencyjnych kontenerów użyć - wybierz wektor
Jeśli wydaje Ci się że lepsza będzie lista - wybierz wektor
(coś tam dalej jeszcze było ale już nie pamiętam ;) )

Jeśli upierasz się przy liście i iteratorach - zacznij od lektury
https://cplusplus.com/reference/iterator/BidirectionalIterator/

Masz tam listę operacji które można wykonać przy pomocy takiego iteratora.

1
zkubinski napisał(a):

chodzi mi o coś takiego

int main()
{
    string tab[]={"Napis 1", "Napis 2", "Napis 3"};

    unsigned int element;
    cin >> element;

    for(unsigned int i=0; i<tab->size(); ++i){
        if(i==element){
            cout << tab[element] << endl;
        }
    }

    return 0;
}

Zacznijmy od podstawowej algorytmiki czyli przekształcenie z O(N) na O(1)

int main()
{
    string tab[]={"Napis 1", "Napis 2", "Napis 3"};
    unsigned int i;
    cin>>i;
    if((0<=i)&&(i<=sizeof(tab)/sizeof(*tab))) cout<<tab[i]<<endl;
    return 0;
}

Zauważ teraz nie tylko się kompiluje ale nawet działa.

a jak uzyskać to samo za pomocą iteratora ? Niżej NIEPOPRAWNY kod i nie wiem jak to ugryźć

void data(int number){
        std::list<string>::iterator it;

        for(it = varItem.begin(); it != varItem.end(); ++it){
            cout << it->at(number);
        }
    }

I tu nasuwa się pytanie: - uzyskać co? Nie widzę nic wspólnego pomiędzy tymi kodami.
Czym jest tym varItem?
at jest dla całego kontenera ale nie dla listy.
Jeżeli masz vector<string> varItem; to wystarczy cout<<varItem[number]<<endl jeżeli to jest jednak
list<string>::varItem to:

void data(unsigned number)
{
    list<string>::iterator it=begin(varItem);
    while((number--)&&(it!=end(varItem))) ++it;
    cout<<*it<<endl;
}

Poza tym zmienne globalne? WTF?
Pierwsze czego ci brakuje to zrozumienie faktu że z gówna bata nie ukręcisz, to alegoria do tego że z twoich kodów nie da się wywnioskować czego chcesz.
Więc pisz po ludzku, coś w stylu:
Mam dane: list<string> varItem {"Napis 1", "Napis 2", "Napis 3"};
Potrzebuje: ...

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