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&
会更好