首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

问一个有关std:list的有关问题

2013-06-26 
问一个有关std::list的问题有一个全局变量std::listNODE gList,其中NODE是结构体struct{int lenchar* m

问一个有关std::list的问题
有一个全局变量std::list<NODE> gList,其中NODE是结构体
struct
{
int len;
char* msg;
}NODE;
我像如下这样添加元素可以吗?
void add()
{
NODE p;
p->len=5;
p->msg=new char[6];
strcpy(p->msg,"hello");
gList.push_back(p);
}

这样问的原因是p是局部变量,这样添加在add方法之外能不能正常访问元素?还是一离开ad
[解决办法]
可以list中保存的是 p的一个拷贝
[解决办法]
啥也不说,自己看代码



typedef struct
{
int len;
char* msg;
}NODE;

list<NODE>gList;

void add()
{
    NODE p;
p.len=5;
p.msg=new char[6];
strcpy(p.msg,"hello");
gList.push_back(p);
}
void main()
{
add();
list<NODE>::iterator iter=gList.begin();
list<NODE>::iterator end=gList.end();
   for (;iter!=end;iter++)
   {
   cout<<(*iter).len<<endl;
       cout<<(*iter).msg<<endl;
   }
}

[解决办法]
NODE结构体没有显示拷贝构造和赋值操作符,编译器会使用缺省进行位拷贝。
void add()
{
NODE p;
p->len=5;
p->msg=new char[6];
strcpy(p->msg,"hello");
gList.push_back(p);  // 保存的是p的拷贝,木有问题。其他地方是可以直接访问list成员的,注意最后gList.clear()之前先delete []每个msg即可。
}
[解决办法]
给std::list push_back使用的是拷贝赋值
只要你add函数出来时没有delete []p->msg;
那么list中那个结构体元素里面的msg也是指向那个堆空间 也就能使用

热点排行