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

C++ 如何在屏幕上显示对象列表?,c++,list,stl,C++,List,Stl,正如我在问题中所说,我试图在屏幕上显示已创建对象的值,但输出是下面的循环,而不是列表本身 我使用函数list.begin()检查列表是否正确,它是否有效地显示了1,因此我不理解for循环中的值为什么不正确 总之,我没有发现错误,所以我想问你我哪里错了 提前谢谢 #include <iostream> #include <list> using namespace std; class Algo{ private: list <int> l; pu

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

我使用函数
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";
    }
}
#包括
#包括
使用名称空间std;
类算法{
私人:
清单l;
公众:
Algo(){l={1,2,3,4,5};}
list getList(){return l;}
};
int main()
{
阿尔戈a;
列表::迭代器;
it=(a.getList().begin());
for(it;it!=(a.getList().end());it++)
{

cout在getlist函数中,您应该返回

list <int>& getList() { return l; }
get list函数将列表和迭代器的副本返回给它的第一个元素

现在进入for循环

a.getList().end()
更重要的是,这一部分您正在创建另一个副本,而不是您在上面的初始化中使用的副本

现在使用中的“&”

list&getList()

您返回的是algo类的实际列表&而不是它的副本,因此getlist函数将在每次您应该返回的getlist函数中为您返回相同的列表

list <int>& getList() { return l; }
get list函数将列表和迭代器的副本返回给它的第一个元素

现在进入for循环

a.getList().end()
更重要的是,这一部分您正在创建另一个副本,而不是您在上面的初始化中使用的副本

现在使用中的“&”

list&getList()
您返回的是algo类的实际列表,而不是它的副本,因此getlist函数每次都会为您返回相同的列表
在循环中,您会得到列表另一个副本的迭代器,该迭代器无法与
getList().begin()
的初始迭代器进行比较。因此循环是无限的(迭代器不可比较),输出是垃圾(输出时不存在临时副本)。通过返回对incapsulated列表的引用来修复它:

list <int>& getList()
list&getList()
list getList()
返回压缩列表的临时副本。每次在循环中调用
a.getList().end()
,都会得到列表另一个副本的迭代器,该迭代器无法与
getList().begin()
的初始迭代器进行比较。因此循环是无限的(迭代器是不可比较的)并且输出为垃圾邮件(输出时不存在临时副本)。通过返回对incapsulated列表的引用来修复它:

list <int>& getList()
list&getList()

正如其他人所指出的,您将返回列表的副本

  • 避免使用像
    l
    这样的名称:它们非常容易混淆。请使用像
    \lst
    这样的名称
  • 根据您的目的,您可能希望返回:
    • 副本–客户端可以修改副本,而无需更改
      \lst
      成员:
      list getList()
    • 引用–避免复制,客户端可以直接修改它:
      list&getList()
    • 或常量引用–无副本,客户端无法修改它
      \lst
      const list&getList()const
  • 如果您只是想显示列表的内容,只需添加一个公共成员函数并删除
    getList
    void dump()const
  • 您可以使用
    复制
    算法将列表内容复制到控制台,而不是直接通过
    迭代

    void dump()
    {
      copy(_lst.begin(), _lst.end(), std::ostream_iterator<int>(std::cout, "\n"));
    }
    

  • 正如其他人指出的,您返回了列表的副本

  • 避免使用像
    l
    这样的名称:它们非常容易混淆。请使用像
    \lst
    这样的名称
  • 根据您的目的,您可能希望返回:
    • 副本–客户端可以修改副本,而无需更改
      \lst
      成员:
      list getList()
    • 引用–避免复制,客户端可以直接修改它:
      list&getList()
    • 或常量引用–无副本,客户端无法修改它
      \lst
      const list&getList()const
  • 如果您只是想显示列表的内容,只需添加一个公共成员函数并删除
    getList
    void dump()const
  • 您可以使用
    复制
    算法将列表内容复制到控制台,而不是直接通过
    迭代

    void dump()
    {
      copy(_lst.begin(), _lst.end(), std::ostream_iterator<int>(std::cout, "\n"));
    }
    

  • 更重要的是,如果没有答案中提到的更改,
    it=(a.getList().begin());
    获取临时
    list
    的迭代器。列表很快就消失了,留下一个悬空的迭代器,使用它将调用未定义的行为。更重要的是,没有答案中提到的更改
    it=(a.getList().begin());
    获取一个临时
    list
    的迭代器。该列表很快就会消失,留下一个悬空的迭代器,使用它将调用未定义的行为。
    const list&
    会更好
    const list&
    会更好