如何在屏幕上显示对象列表?

时间:2019-10-12 16:44:44

标签: c++ list stl

正如我在问题中所说的,我试图在屏幕上显示已创建对象的值,但是输出是下面的循环而不是列表本身。

我已经使用函数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(无限循环)

3 个答案:

答案 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)

正如其他人指出的那样,您返回列表的副本。

  1. 避免使用诸如l之类的名称:它们非常令人困惑。使用类似_lst的东西。
  2. 根据您的目的,您可能需要返回:
    • 副本–客户端可以修改副本而无需更改_lst成员:list <int> getList()
    • 参考-避免复制,客户可以直接对其进行修改:list <int>& getList()
    • 或常量引用–无副本,客户端无法对其进行修改_lstconst list <int>& getList() const
  3. 如果您唯一的意图是显示列表的内容,只需添加一个公共成员函数并删除getListvoid dump() const
  4. 您可以使用_lst算法而不是直接通过copy来将列表内容复制到控制台

    void dump()
    {
      copy(_lst.begin(), _lst.end(), std::ostream_iterator<int>(std::cout, "\n"));
    }
    
  5. 您的主要人员变为:

    int main()
    {
      Algo a;
      a.dump();
    }