【问题标题】:How do I iterate over a Constant Vector?如何迭代常量向量?
【发布时间】:2025-12-05 02:10:01
【问题描述】:

我有一个包含字段名称的 Student 向量。

我想遍历向量。

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

这在 C++ 中显然是非法的。

请帮忙。

【问题讨论】:

  • 请阅读前缀与后缀增量运算符。 it++ 应该是 ++it,并且在极少数情况下需要 it++(即在迭代时擦除)。
  • 在这种情况下问题很明显。但是,将来您应该在问题中包含编译器给您的确切错误消息。

标签: c++ visual-c++


【解决方案1】:

您有两个(C++11 中为三个)选项:const_iterators 和索引(+ C++11 中的“range-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
  */
}

您应该更喜欢使用 != 而不是 &lt; 与迭代器 - 后者不适用于所有迭代器,前者可以。使用前者,您甚至可以使代码更通用(这样您甚至可以在不触及循环的情况下更改容器类型)

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

【讨论】:

  • 我是迭代器的新手。你能告诉我哪些迭代器不喜欢 != 以及为什么?
  • @kunjaan:只有随机访问迭代器支持排序(&lt;),其他不支持。例如,std::list 具有双向迭代器,只能比较是否相等。
【解决方案2】:

请改用const_iteratoriterator 允许修改 vector,因此您无法从 const 容器中获取。

此外,编写此循环的惯用方式是使用it != students.end() 而不是&lt;(尽管这应该适用于vector)。

【讨论】:

  • ...但是如果您决定更改为使用list 或类似的东西,您的代码将无法工作。所以请使用!= 表单。
【解决方案3】:

C++11 风格:

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

【讨论】:

  • 被低估的答案:)
  • 为什么你认为这无关?这就是您在 C++11 中迭代 const 向量的方式。
  • 我说被低估但拼错了一个 r。反正,不说无关的。
【解决方案4】:

vector&lt;Student&gt;::const_iterator代替vector&lt;Student&gt;::iterator

【讨论】:

    【解决方案5】:
    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;
            }
        }
    

    【讨论】:

      【解决方案6】:
      void print(const vector<Student>& students)
          {
          for(auto it = students.begin(); it != students.end(); ++it)
              {
                  cout << it->name << endl;
              }
          }
      

      【讨论】:

      • 此问题未标记 C++0x
      • 但是很高兴我们能记住这个特性,也许会鼓励我们切换到 C++11。 +1