正如我在问题中所说的,我试图在屏幕上显示已创建对象的值,但是输出是下面的循环而不是列表本身。
我已经使用函数list.begin()
来检查列表是否正确并有效地显示了1
,所以我不明白为什么for循环中的值不正确。
总而言之,我没有发现错误,所以我想问你我哪里错了。
谢谢。
#include <iostream>
#include <list>
using namespace std;
class Algo{
private:
list <int> l;
public:
Algo() {l = {1, 2, 3, 4, 5};}
list <int> getList() {return l;}
};
int main()
{
Algo a;
list <int>::iterator it;
it = (a.getList().begin());
for(it; it != (a.getList().end()); it++)
{
cout << *it << "\n";
}
}
预期输出:1、2、3、4、5
实际输出:1
-1952806520
16122456
-1228957360
1
-1952806520
16122456
-1228957360
1(无限循环)
答案 0 :(得分:1)
在您的getlist函数中,您应该返回
list <int>& getList() { return l; }
而不是
list <int> getList() { return l; }
是列表的副本。由于您使用该列表的方式
在此处调用时
it=(a.getList().begin());
get list函数将列表和迭代器的副本返回到其第一个元素
现在进入for循环
a.getList().end()
更重要的是,您将在此部分中创建另一个副本,而不是上面的初始化中使用的副本
现在在
中使用“&”list <int>& getList()
您将返回算法类的实际列表,而不是其副本,因此getlist函数每次都将为您返回相同的列表
答案 1 :(得分:1)
list <int> getList()
返回封装列表的临时副本。每次在循环中调用a.getList().end()
时,都会得到列表的另一个副本的迭代器,该副本无法与getList().begin()
的初始迭代器进行比较。因此,循环是无限的(迭代器不可比较),输出是垃圾(输出中不存在临时副本)。通过返回对封装列表的引用来对其进行修复:
list <int>& getList()
答案 2 :(得分:0)
正如其他人指出的那样,您返回列表的副本。
l
之类的名称:它们非常令人困惑。使用类似_lst
的东西。_lst
成员:list <int> getList()
list <int>& getList()
_lst
:const list <int>& getList() const
getList
:void dump() const
。您可以使用_lst
算法而不是直接通过copy
来将列表内容复制到控制台
void dump()
{
copy(_lst.begin(), _lst.end(), std::ostream_iterator<int>(std::cout, "\n"));
}
您的主要人员变为:
int main()
{
Algo a;
a.dump();
}