如何迭代常量向量?

59
我有一个学生向量,其中有一个名字字段。
我想遍历这个向量。
void print(const vector<Student>& students)
    {
    vector<Student>::iterator it;
    for(it = students.begin(); it < students.end(); it++)
        {
            cout << it->name << endl;
        }
    }

在C++中,这显然是不合法的。

请帮忙。


2
请了解前缀和后缀递增运算符的区别。it++ 应该改为 ++it,而 it++ 仅在极少数情况下需要使用(例如在迭代时进行删除操作)。 - user405725
4
这个问题的原因相当明显。但是,将来你应该在你的问题中包含编译器给出的精确错误信息。 - T.E.D.
@user405725:所以...我看到你会用C++编程!:-) - André Caldas
6个回答

76

你有两个选项(C++11中为三个):const_iterator和索引(C++11中还有"范围for")

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
}

我对迭代器还不熟悉。您能告诉我哪些迭代器不支持“!=”,以及为什么吗? - unj2
4
仅随机访问迭代器支持排序(<),其他类型则不支持。例如,std::list具有双向迭代器,只能进行相等比较。 - eq-

20

请使用const_iterator。一个iterator会允许修改vector,所以你无法从一个const容器中获取它。

此外,写这个循环的习惯用法是使用it != students.end()而不是<(虽然在一个vector上应该也可以工作)。


2
但是,如果您决定更改为使用list或类似的东西,您的代码将无法工作。因此,请使用!=形式。 - T.E.D.

9

C++11风格:

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

被低估的答案 :) - Erik Campobadal
你为什么认为这不相关?这是如何在C++11中迭代const向量的方法。 - Shital Shah
4
我说被低估了,但是只打了一个 r 的错字。无论如何,不会讲不相关的事情。 - Erik Campobadal

4

使用 vector<Student>::const_iterator 替代 vector<Student>::iterator


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;
        }
    }

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

1
此问题未标记为C++0x。 - smerlin
2
但这很好地提醒我们该特性,或许鼓励我们转向C++11。+1 - Offirmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接