遍历列表时遇到问题

Posted

技术标签:

【中文标题】遍历列表时遇到问题【英文标题】:Trouble iterating through a list 【发布时间】:2014-02-02 02:44:52 【问题描述】:

我正在从事这个项目,该项目基本上从文件中读取信息,在对象上使用该信息,然后创建一个包含对象的列表。

我有一个名为Acao 的类,它基本上包含一些信息、一些字符串和一些浮点数。很简单;

为了检查我的列表是否正确构建,我正在尝试使用 Acao 类的 getcMed() 成员输出一个名为 cMed 的浮点数。

好的,首先:

我在尝试遍历我的列表时遇到三个错误,与操作员 =!=++ 在一起。

他们都是——分别:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::_List_iterator<std::_List_val<std::_List_simple_types<Acao>>>' (or there is no acceptable conversion)

尽管我认为在这种情况下这并不重要,但这些是我包含的库:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <list>
#include <stdlib.h>
#include <sstream>

那么,我对这段代码的第二个问题是:

cout << (*it)->getcMed();

我的list 和迭代器it 都是Acao 类型,但是我的编译器(我的IDE 和编译器使用VS 2013)给了我以下错误:

错误 C2039:“getcMed”:不是“std::list>”的成员

这是有问题的代码块(另请注意:我为此使用命名空间 std):

list<Acao> novaListaAcoes()
fstream file;
streampos begin;
list<Acao> listaAcoes, it;
Acao A;
string linha, papel, companhia, tipo;
float min, med, max;

file.open("G:\\VS\\ConsoleApplication4\\BDINaux.txt");
file.clear();
file.seekg(0, ios::beg);
listaAcoes.clear();

while (!file.eof())
    getline(file, linha);
    if (file.eof()) break; 
    vector<char> vector(linha.begin(), linha.end());

    min = calcMin(vector);
    max = calcMax(vector);
    med = calcMed(vector);
    papel = lePapel(vector);
    companhia = leComapanhia(vector);
    tipo = leTipo(vector);
    vector.clear();
    A.setCompanhia(companhia);
    A.setCotacao(med, min, max);
    A.setNomePapel(papel);
    cout << papel<< endl;
    listaAcoes.push_back(A);


cout << "fim loop\n";
for (it = listaAcoes.begin(); it != listaAcoes.end(); ++it)
    cout << (*it)->getcMed();

return listaAcoes;

【问题讨论】:

for (it = : it 又是哪一种了??使用autolist&lt;Acao&gt;::iterator 怎么样? 它在上面的行中声明:list&lt;Acao&gt; listaAcoes, it; 我不知道auto,我会尝试list&lt;acao&gt;::iterator 解决方案,谢谢您的回复。 好的,使用list&lt;Acao&gt;::iterator 似乎已经解决了前几个问题。我现在正在处理:Error 1 error C2819: type 'Acao' does not have an overloaded member 'operator -&gt;'Error 2 error C2232: '-&gt;Acao::getcMed' : left operand has 'class' type, use '.' it-&gt;getcMed(); 替换(*it)-&gt;getcMed(); 没有错误。检查输出以查看它是否正常工作。 '似乎已经解决了前几个问题' 更多不同类型的问题,请在此处询问不同类型/更多问题。我不是你的保姆!!寻找我的答案的更新... 【参考方案1】:

您的声明:

list<Acao> listaAcoes, it;

for 循环初始化器中的赋值语句所需的类型不匹配:

for (it = listaAcoes.begin(); // <<<

it单独声明:

list<Acao>::iterator it;

迭代器是c++ 容器类的概念,但不等同于它们本身的类实例!

我个人更喜欢的习惯用法是声明最接近其用途的变量,例如 for 循环:

for (std::list<Acao>::iterator it = listaAcoes.begin();
     it != listaAcoes.end();
     ++it)

    // Access it's underlying Acao instance using -> or * dereference operators

【讨论】:

感谢您的回复。这确实是一个解决方案。至于我的问题的第二部分:用it-&gt;getcMed(); 替换(*it)-&gt;getcMed(); 就像一个魅力。感谢您的帮助

以上是关于遍历列表时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中删除某些嵌套的 JSON 对象时遇到问题

遍历数组时遇到问题

For 循环遍历列表框

递归遍历家谱时遇到问题

Apache Camel 遍历列表

JS 原生 push对象到数组中遇到的问题