有关list跌代器的问题

xiyuxi2001 2003-08-15 09:52:11
我的程序
struct CThrid
{
string ip;
int port;
};
然后我定义个变量
CThrid third;
list <CThrid> thirdlist;
list<CThrid>::iterator thirditer ;
third.ip = "192.168.0.5";
third.port = 8000; thirdlist.push_back(third);
thirditer = thirdlist.begin(); {
cout<<(*thirditer).ip<<(*thirditer).Port<<endl;

为什么输出是负数,而不是我射定的内容???
那位知道是哪里的问题吗?
...全文
56 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevencat 2003-08-17
  • 打赏
  • 举报
回复
我有个与这个无关的建议。
在这个里面最好不要直接用
list <CThrid> thirdlist;
list<CThrid*>thirdlist;可能稍微好一点。
因为上面一个涉及到一个CThird的COPY,他不是直接将CThird放入链表而是生成一个COPY。
而下面一个是直接推进一个指针。
list<int>intlist这种本来无所谓了,但是当NODE大了后最好还是直接用指针吧。我想。
在对效率要求比较高的地方可能会看出差别的。
smartduck 2003-08-16
  • 打赏
  • 举报
回复
list 的内部数据结果其实是双环队列。
它必须有一个空的节点表示是尾部。
当list为空时,其实有一个空的节点是存在的。它的prev=自己,next=自己,内容随机。
所以
CThrid third;
list <CThrid> thirdlist;
list<CThrid>::iterator thirditer ;
这是thirditer指向的就是这个空的节点!虽然你做了push_back操作,但是thirditer的指向依然没有改变。所以cout<<(*thirditer).ip<<(*thirditer).Port<<endl;输出是负数
ShiChao 2003-08-16
  • 打赏
  • 举报
回复
重载CThrid::operator<<
yhspring 2003-08-15
  • 打赏
  • 举报
回复
third.set_Ip((*tagiter).ip);
third.set_Port((*tagiter).port);
把这个贴出来看看
rtdb 2003-08-15
  • 打赏
  • 举报
回复
看一下你的set_Ip()/get_Ip()这对函数。
xiyuxi2001 2003-08-15
  • 打赏
  • 举报
回复
可是单独放在一个测试的小程序中就有行! 真不知道到底是怎么回事???
xiyuxi2001 2003-08-15
  • 打赏
  • 举报
回复
我跟踪发现 就是在 push_back 的时候 third的ip和port 不见啦。? 为什么啊?
xiyuxi2001 2003-08-15
  • 打赏
  • 举报
回复
觉得你说的不对啊。其实建立啦一个thirditer 链表是个空的。第一次push_back 应当是链表头。这段代码如果单独来用就没问题。如fangrk(加把油,伙计!) 那样就可以但我的程序中和这个略有不同。我就是找不出。加如链表元素后。取出来时就是不对。真实代码如下
for(tagiter = pParent->m_parameter->m_userlist.begin(); tagiter !=pParent->m_parameter->m_userlist.end(); ++tagiter)
{
third.set_Ip((*tagiter).ip);
third.set_Port((*tagiter).port);
third.set_tcpData(tcpdata);
thirdlist.push_back(third);
}

for(thirditer = thirdlist.begin(); thirditer != thirdlist.end(); ++thirditer)
{
cout<<(*thirditer).get_Ip()<<(*thirditer).get_Port()<<endl;

}

结果明明元素加入链表啦。 可是取出来时就是没有。???
那位知道为什么会这样啊?
yhspring 2003-08-15
  • 打赏
  • 举报
回复
struct CThrid
{
string ip;
int port;
};
然后我定义个变量
CThrid third;
list <CThrid> thirdlist;
list<CThrid>::iterator thirditer ;
third.ip = "192.168.0.5";
third.port = 8000; thirdlist.push_back(third);
thirditer=thirdlist.end()-1;
cout<<(*thirditer).ip<<(*thirditer).port<<endl;
你把内容插入到后面,迭代器却取开头,当然不正确了
fangrk 2003-08-15
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <list>
using namespace std;

struct CThrid
{
string ip;
int port;
};
int main()
{
CThrid third;
list <CThrid> thirdlist;
list<CThrid>::iterator thirditer ;
third.ip = "192.168.0.5";
third.port = 8000;
thirdlist.push_back(third);
thirditer = thirdlist.begin();
cout<<(*thirditer).ip<<(*thirditer).port<<endl;

}
jwwu 2003-08-15
  • 打赏
  • 举报
回复
好像没有问题
oopig 2003-08-15
  • 打赏
  • 举报
回复
这段程序没有问题。你把完整代码贴出来看看。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧