Как перебирать константный вектор?
У меня есть вектор Student, у которого есть имя поля.
Я хочу перебрать вектор.
void print(const vector<Student>& students)
{
vector<Student>::iterator it;
for(it = students.begin(); it < students.end(); it++)
{
cout << it->name << endl;
}
}
Это, по-видимому, незаконно в С++.
Пожалуйста, помогите.
Ответы
Ответ 1
У вас есть две (три в С++ 11) опции: const_iterator
и индексы (+ "range-for" в С++ 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
*/
}
Вы должны использовать !=
вместо <
с помощью итераторов - последний не работает со всеми итераторами, первый будет. С первым вы даже можете сделать код более общим (чтобы вы могли даже изменить тип контейнера, не касаясь цикла)
template<typename Container>
void func(const Container& container) {
typename Container::const_iterator iter;
for (iter = container.begin(); iter != container.end(); ++iter)
// work with *iter
}
Ответ 2
Используйте const_iterator
вместо этого. iterator
позволяет изменять vector
, поэтому вы не можете получить его из контейнера const
.
Кроме того, идиоматический способ записи этого цикла использует it != students.end()
вместо <
(хотя это должно работать на vector
).
Ответ 3
Вместо vector<Student>::iterator
используйте vector<Student>::const_iterator
.
Ответ 4
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;
}
}
Ответ 5
void print(const vector<Student>& students)
{
for(auto it = students.begin(); it != students.end(); ++it)
{
cout << it->name << endl;
}
}
Ответ 6
Стиль С++ 11:
void print(const vector<Student>& students) {
for(auto const& student : students) {
cout << student.name << endl;
}
}