• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeszukiwanie listy

VPS Starter Arubacloud
0 głosów
1,308 wizyt
pytanie zadane 18 sierpnia 2017 w C i C++ przez Virus_K Początkujący (280 p.)
Cześć wszystkim!

Chcę napisać program, który zbierze dla mnie bliżej nieokreśloną ilość liczb spełniającą pewne warunki. Pomyślałem, ze użycie listy będzie dobrym pomysłem, tylko czy jest jakiś sposób na odszukanie  n-tego elementu listy nie znając jego wartości?

4 odpowiedzi

0 głosów
odpowiedź 18 sierpnia 2017 przez Bondrusiek Maniak (61,440 p.)

Witam,

wydaje mi się że lepszym kontenerem od listy jest vector. W vector możesz odwołać się do zmiennej za pomocą operatoru [] lub metodą at().

np.

vector<int> tablica(2);
tablica.push_back(1);
tablica.push_back(2);
cout << tablica[0] << " " << tablica.at(1) << endl; // wyświetli dwa razy 1

Tutaj na szybko stworzyłem kod. Może Ci to pomoże.

#include <list>
#include <iostream>

using namespace std;

int main()
{
//zbierze dla mnie bliżej nieokreśloną ilość liczb spełniającą pewne warunki(tutaj dałem jekies przykładowe od 1 - 10
list<int> lista;
lista.push_back(1);
lista.push_back(2);
lista.push_back(3);
lista.push_back(4);
lista.push_back(5);
lista.push_back(6);
lista.push_back(7);
lista.push_back(8);
lista.push_back(9);
lista.push_back(10);
//szukanie  n-tego, na przykład indeks 6 bo liczy się od 0
int nElement = 5;
list<int>::iterator iter;
int index, value = 0;
for(iter = lista.begin() , index = 0; iter != lista.end() ; ++index , ++iter)
{
    // sposób na odszukanie  n-tego elementu listy nie
    if(index == nElement){
        value = *iter;
        break;
    }

}

cout << "Wartosc n-tego elementu " << value << endl;


system("pause");
return 0;
}

 

komentarz 18 sierpnia 2017 przez Evelek Nałogowiec (28,960 p.)
Bondrusiek po co używasz at() bez obsługi wyjątków?
komentarz 18 sierpnia 2017 przez Bondrusiek Maniak (61,440 p.)
@Evelek

Nie wiem o co Ci chodzi odnośnie obsług wyjątków(nie ogarniam tego jeszcze). Wiem tylko z książek, że lepsze jest pobieranie wartości tylko do odczytu używając metody at() zamiast przeładowywać operator []
1
komentarz 18 sierpnia 2017 przez Evelek Nałogowiec (28,960 p.)
Czy jest lepsze to bym spekulował. Jeśli mamy pewność, że odczytamy poprawny adres vectora, to używamy []. A jeśli chcemy "ryzykować", to używamy at(), które nam rzuci wyjątek out_of_range jeśli odczytamy niepoprawny adres. Nieobsłużony wyjątek zamyka nam program, a po przechwyceniu go możemy go obsłużyć i nasz program kontynuuje swe działanie.
0 głosów
odpowiedź 18 sierpnia 2017 przez Evelek Nałogowiec (28,960 p.)
#include <list>
#include <iterator>
#include <iostream>
using namespace std;

int main(){
    list<int> lista {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    cout << "Odczytaj wartosc, ktora jest szosta w kolejnosci:" << endl;
    auto pos = lista.cbegin();
    advance(pos, 5);
    cout << *pos;
}

 

komentarz 18 sierpnia 2017 przez Virus_K Początkujący (280 p.)
edycja 18 sierpnia 2017 przez Virus_K
Czy funkcja cbegin() ustala miejsce od którego później zaczniemy odliczanie do pięciu na miejsce pierwsze czyli na sam początek listy?

Jeśli tak to w jaki sposób (i czy to w ogóle jest możliwe)  mógłbym ustalić to miejsce na przykład na czwarte w liście?
1
komentarz 18 sierpnia 2017 przez Evelek Nałogowiec (28,960 p.)

Najpierw wyjaśnienia: mamy dwie podobne funkcje: begin() oraz cbegin(). Różnica pomiędzy nimi jest taka:

#include <list>
#include <iterator>
#include <iostream>
using namespace std;
 
int main(){
    list<int> lista {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
     
    cout << "Odczytaj wartosc, ktora jest szosta w kolejnosci:" << endl;
    auto pos = lista.begin();
    advance(pos, 5);
    *pos = 100;
    cout << *pos;
}

Samo begin() pozwoli nam na modyfikację wartości wskazywanej przez iterator pos, zaś uzycie cbegin() nam na to nie pozwoli:

#include <list>
#include <iterator>
#include <iostream>
using namespace std;
 
int main(){
    list<int> lista {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
     
    cout << "Odczytaj wartosc, ktora jest szosta w kolejnosci:" << endl;
    auto pos = lista.cbegin();
    advance(pos, 5);
    *pos = 100; // błąd: assignment in read-only location
    cout << *pos;
}

Literka c w funkcji cbegin() to skrót od const, czyli stały. Funkcje begin() oraz cbegin() wskazują zawsze na pierwszy początkowy element danego kontenera.

Następnie użyłem funkcji advance() w celu przesunięcia iteratora pos o 5 miejsc do przodu. Jeśli chcesz go ustawić na miejsce czwarte, napiszesz: advance(pos, 3). Poeksperymentuj. smiley Ale tak jak już napisał mokrowski, użycie vectora będzie lepsze. Ale jeśli chcesz poznać jak działa kontener list, to użyj list. wink Na koniec możesz jeszcze to samo napisać ale używając forward_list.

komentarz 18 sierpnia 2017 przez Virus_K Początkujący (280 p.)
To wiele wyjaśnia, dzięki ;)
0 głosów
odpowiedź 18 sierpnia 2017 przez mokrowski Mędrzec (156,260 p.)
Jeśli nie masz ku temu poważnych powodów by stosować listę, zastosuj vector. Lista ma duży narzut związany z wydajnością bo pogarsza współczynnik trafiania w cache procesora. Wartości wskazują na "porozrzucane" adresy pamięci. Za to lista broni się szybkim wstawianiem przy znanym elemencie przed/po. vector przy wstawieniu elementu pomiędzy inne powoduje kopiowanie zawartości pamięci wszystkich elementów po oraz w najbardziej pesymistycznym przypadku kopiowanie całości wektora.
komentarz 18 sierpnia 2017 przez Virus_K Początkujący (280 p.)
Chcę znaleźć wartość jakiegoś elementu np 4-tego wykonać na nim pewne operacje a później przeskoczyć do 5-tego elementu i zrobić z nim to samo. Jeżeli dobrze rozumiem to co napisałeś to w tym przypadku lista będzie lepszym rozwiązaniem.
1
komentarz 18 sierpnia 2017 przez Evelek Nałogowiec (28,960 p.)
Użycie vectora będzie lepsze, bo pozwoli Ci na bezpośrednie odwoływanie się do elementów.
1
komentarz 18 sierpnia 2017 przez mokrowski Mędrzec (156,260 p.)
Jeśli potrzebujesz tego co napisałeś, użyj vector.
0 głosów
odpowiedź 18 sierpnia 2017 przez Virus_K Początkujący (280 p.)
Dzięki za odpowiedzi, zaraz przetestuję obie wersje ;)

Podobne pytania

+1 głos
0 odpowiedzi 471 wizyt
+1 głos
1 odpowiedź 1,094 wizyt
pytanie zadane 23 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,420 p.)
0 głosów
4 odpowiedzi 410 wizyt

93,004 zapytań

141,969 odpowiedzi

321,248 komentarzy

62,340 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...