【问题标题】:How to iterate through a list of objects in C++?如何遍历 C++ 中的对象列表?
【发布时间】:2023-03-04 09:31:01
【问题描述】:

我对 C++ 非常陌生,并且正在努力弄清楚我应该如何遍历对象列表并访问它们的成员。

我一直在尝试这个 data 是一个 std::listStudent 一个类。

std::list<Student>::iterator<Student> it;
for (it = data.begin(); it != data.end(); ++it) {
    std::cout<<(*it)->name;
}

并得到以下错误:

error: base operand of ‘->’ has non-pointer type ‘Student’

【问题讨论】:

  • 首先您需要阅读有关如何声明迭代器变量的更多信息。提示:它们不是模板。其次,虽然迭代器在某些方面可以被视为指针,但一旦取消引用它,它就不再是“指针”而是值。

标签: c++ for-loop c++11 stl iterator


【解决方案1】:

如果添加#include &lt;algorithm&gt;,则可以使用for_each 函数和lambda 函数,如下所示:

for_each(data.begin(), data.end(), [](Student *it) 
{
    std::cout<<it->name;
});

你可以在https://en.cppreference.com/w/cpp/algorithm阅读更多关于算法库的信息

关于 cpp 中的 lambda 函数https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp?view=vs-2019

【讨论】:

    【解决方案2】:

    值得一提的是,如果您不打算修改列表的值,则可以(并且更好)使用const_iterator,如下所示:

    for (std::list<Student>::const_iterator it = data.begin(); it != data.end(); ++it){
        // do whatever you wish but don't modify the list elements
        std::cout << it->name;
    }
    

    【讨论】:

    • 从 C++11 开始,我们有了 cbegin()cend()
    【解决方案3】:

    -> 它就像指针一样工作,你不必使用 *

    for( list<student>::iterator iter= data.begin(); iter != data.end(); iter++ )
    cout<<iter->name; //'iter' not 'it'
    

    【讨论】:

      【解决方案4】:

      从 C++ 11 开始,您可以执行以下操作:

      for(const auto& student : data)
      {
        std::cout << student.name << std::endl;
      }
      

      【讨论】:

      • const 在基于范围的循环中是强制性的还是避免它是一个坏习惯?
      • 最好的做法是防止您(或在您之后修改它的任何人)在迭代时更改向量的内容。如果你正在实现一个转换函数,你可能想要改变向量并因此删除 const。但通常不建议编写符合大多数行业标准的代码。
      • 对于 C++11 版本,如果有的话,在可能的内部循环索引溢出之前的最大元素数是多少?我说的是 Linux 上的 Visual Studio 和 gcc。
      • @user2284570 据我所知,您将被限制为 std::vector&lt;T&gt;::size_type 的最大值,即 2^64 / sizeof(T)(即可以表示的最大对象数在内存的地址空间中。这也是为什么在某些情况下不应该使用 STL 容器来替换数据库的原因。
      【解决方案5】:

      你已经接近了。

      std::list<Student>::iterator it;
      for (it = data.begin(); it != data.end(); ++it){
          std::cout << it->name;
      }
      

      请注意,您可以在for 循环内定义it

      for (std::list<Student>::iterator it = data.begin(); it != data.end(); ++it){
          std::cout << it->name;
      }
      

      如果您使用的是 C++11,那么您可以改用基于范围的 for 循环:

      for (auto const& i : data) {
          std::cout << i.name;
      }
      

      这里auto 自动推断出正确的类型。你可以改写Student const&amp; i

      【讨论】:

      • 对于 C++11 版本,如果有的话,在可能的内部循环索引溢出之前的最大元素数是多少?我说的是 Linux 上的 Visual Studio 和 gcc。
      • @user2284570 不涉及任何循环索引,仅涉及迭代器。
      • @Deduplicator 我是编译器内部的意思。
      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多