Как перебрать постоянный вектор? - PullRequest
42 голосов
/ 03 февраля 2011

У меня есть вектор Student, у которого есть имя поля.

Я хочу перебрать вектор.

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

Это явно недопустимо в C ++.

Пожалуйста, помогите.

Ответы [ 6 ]

59 голосов
/ 03 февраля 2011

У вас есть две (три в C ++ 11) опции: const_iterator s и индексы (+ "range-for" в 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
  */
}

Вы должны предпочесть использовать != вместо < с итераторами - последний не работает со всеми итераторами, первый будет. С первым вы можете даже сделать код более универсальным (чтобы вы могли даже изменить тип контейнера, не касаясь цикла)

template<typename Container>
void func(const Container& container) {
  typename Container::const_iterator iter;
  for (iter = container.begin(); iter != container.end(); ++iter)
    // work with *iter
}
18 голосов
/ 03 февраля 2011

Используйте const_iterator вместо.iterator позволяет модифицировать vector, поэтому вы не можете получить его из контейнера const.

Кроме того, идиоматический способ написания этого цикла использует it != students.end() вместо <(хотя это должно работать на vector).

3 голосов
/ 16 мая 2016

C ++ 11 стиль:

void print(const vector<Student>& students) {
    for(auto const& student : students) {
            cout << student.name << endl;
    }
}
3 голосов
/ 03 февраля 2011

Вместо vector<Student>::iterator используйте vector<Student>::const_iterator.

2 голосов
/ 03 февраля 2011
void print(const vector<Student>& students)
    {
    for(auto it = students.begin(); it != students.end(); ++it)
        {
            cout << it->name << endl;
        }
    }
2 голосов
/ 03 февраля 2011
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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...