2011-02-03 10 views
36

Mam wektor studenta, który ma nazwę pola.Jak wykonać iteracje na stałym wektorze?

Chcę iterować nad wektorem.

void print(const vector<Student>& students) 
    { 
    vector<Student>::iterator it; 
    for(it = students.begin(); it < students.end(); it++) 
     { 
      cout << it->name << endl; 
     } 
    } 

Jest to najwyraźniej nielegalne w C++.

Proszę o pomoc.

+2

Proszę przeczytać o porównaniu prefiksu przyrostowy operator przyrostu. 'it ++' powinno być '++ it', a' it ++ 'jest potrzebne w rzadkich przypadkach (np. podczas kasowania podczas iteracji). –

+2

To dość oczywiste, co to jest w tym przypadku. Jednak w przyszłości powinieneś umieścić w swoim pytaniu dokładny komunikat o błędzie, który daje ci kompilator. –

Odpowiedz

53

masz dwie (trzy w 11 C++) opcji: const_iterator s i indeksy (+ "zakres-for" w C++ 11)

void func(const std::vector<type>& vec) { 
    std::vector<type>::const_iterator iter; 
    for (iter = vec.begin(); iter != vec.end(); ++iter) 
    // do something with *iter 

    /* or 
    for (size_t index = 0; index != vec.size(); ++index) 
    // do something with vec[index] 

    // as of C++11 
    for (const auto& item: vec) 
    // do something with item 
    */ 
} 

Należy wolą używać zamiast != z < z iteratorami - ten ostatni nie działa ze wszystkimi iteratorami, ten pierwszy będzie. Z tych pierwszych można nawet uczynić kod bardziej ogólny (tak, że można nawet zmienić typ pojemnika bez dotykania pętla)

template<typename Container> 
void func(const Container& container) { 
    typename Container::const_iterator iter; 
    for (iter = container.begin(); iter != container.end(); ++iter) 
    // work with *iter 
} 
+0

Jestem nowy dla iteratorów. Czy możesz mi powiedzieć, które iteratory nie lubią! = I dlaczego? – unj2

+4

@kunjaan: Tylko losowe iteratory obsługują porządkowanie ('<'), inne nie. Na przykład, std :: list ma dwukierunkowe iteratory, które można porównać tylko dla równości. –

16

Zamiast tego użyj const_iterator. Opcja iterator umożliwia zmianę modelu vector, więc nie można go pobrać z kontenera const.

Również idiomatyczny sposób zapisu tej pętli wykorzystuje it != students.end() zamiast < (chociaż powinno to działać na vector).

+2

... ale jeśli kiedykolwiek zdecydujesz się zmienić na "listę" lub coś podobnego, Twój kod nie zadziała. Tak więc użyj formularza '! ='. –

2
void print(const vector<Student>& students) 
    { 
    vector<Student>::const_iterator it; // const_iterator 
    for(it = students.begin(); it != students.end(); it++) 
     { 
      cout << it->name << endl; 
     } 
    } 
3

Zamiast vector<Student>::iterator, należy użyć vector<Student>::const_iterator.

2
void print(const vector<Student>& students) 
    { 
    for(auto it = students.begin(); it != students.end(); ++it) 
     { 
      cout << it->name << endl; 
     } 
    } 
+1

to pytanie nie jest oznaczone jako C++ 0x – smerlin

+2

Ale dobrze jest pamiętać nas o tej funkcji, być może zachęcając nas do przejścia na C++ 11. +1 – Offirmo

1

C++ 11 styl:

void print(const vector<Student>& students) { 
    for(auto const& student : students) { 
      cout << student.name << endl; 
    } 
}