遍历列表时遇到问题
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
又是哪一种了??使用auto
或list<Acao>::iterator
怎么样?
它在上面的行中声明:list<Acao> listaAcoes, it;
我不知道auto
,我会尝试list<acao>::iterator
解决方案,谢谢您的回复。
好的,使用list<Acao>::iterator
似乎已经解决了前几个问题。我现在正在处理:Error 1 error C2819: type 'Acao' does not have an overloaded member 'operator ->'
和 Error 2 error C2232: '->Acao::getcMed' : left operand has 'class' type, use '.'
。
用it->getcMed();
替换(*it)->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->getcMed();
替换(*it)->getcMed();
就像一个魅力。感谢您的帮助以上是关于遍历列表时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章