Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::multiset::iterator=NULL不再有效?_C++_C++11 - Fatal编程技术网

C++ std::multiset::iterator=NULL不再有效?

C++ std::multiset::iterator=NULL不再有效?,c++,c++11,C++,C++11,我有一些代码正在使用GCC4.7(3.1版)更新到C++11 我将多集定义为类的私有成员: multiset <Object*, objectcomp> objects_; multiset对象; 代码中有一段类似于这样的代码(p_q是一对多集迭代器,很抱歉这一行很糟糕,我迫不及待地想用auto替换它,哈哈): void地形::移除对象(对象*obj){ 对p_q; 迭代器p,q; q=零; p_q=对象的相等范围(obj); for(p=p_q.first;p!=p_q.sec

我有一些代码正在使用GCC4.7(3.1版)更新到C++11

我将多集定义为类的私有成员:

multiset <Object*, objectcomp> objects_;
multiset对象;
代码中有一段类似于这样的代码(p_q是一对多集迭代器,很抱歉这一行很糟糕,我迫不及待地想用auto替换它,哈哈):

void地形::移除对象(对象*obj){
对p_q;
迭代器p,q;
q=零;
p_q=对象的相等范围(obj);
for(p=p_q.first;p!=p_q.second;p++){
如果(*p==obj){q=p;break;}
}
如果(q!=NULL){
…基于q做事情不再是空的
}
}

这将不再编译。您不能再将迭代器设置为null了吗?替代方案是什么?(nullptr也不起作用)

将迭代器设置为NULL是不合法的。您可能很幸运,因为您的特定实现碰巧使用指针作为该类型的迭代器,但它仍然是非法的

正确答案是:

q = objects_.end();
或者,在某些情况下:

q = multiset<Object*, objectcomp>::iterator();
q=multiset::iterator();

您永远无法将迭代器设置为NULL。如果上述代码曾经起作用,那完全是偶然的。考虑到multiset的任何合理实现,很难看到它是如何编译的,更不用说运行了

获取“无处”迭代器的最佳方法是使用容器的末尾。用
q=objects.end()替换
q=NULL


此外,切勿将原始指针放入容器中;这是内存泄漏的公开邀请。你几乎肯定想要
multiset
multiset

这从来都不是有效的。哦,这太尴尬了,哈哈,你知道为什么我的第一个代码块没有显示为代码吗?复制和粘贴不起作用…但是删除
\uucode>,然后剪切,然后粘贴,是不是…很奇怪…原来你有不间断的空格,而不是适当的空格;显然,不间断的空格不算是缩进空格。实现兼容的
std::multiset::iterator
作为原始指针可能是不可能的。我猜它可能会起作用,因为对应的类是从
NULL
@AndreyT隐式转换而来的:它不能是指向节点指针集合的指针吗?我不知道你为什么要这样做,但我不明白为什么这是不可能的……但你是对的,这可能是一个不必要的隐式转换(可能在C++11和/或新的g++/libstdc++中变得显式,因此出现了他的错误)。我甚至从未听说过shared\ptr,我想我会查一下。谢谢你的指针。+1是关于不要在容器中使用原始指针的观点@EricB:再看一看,它让容器拥有指向的对象。如果对象离开容器后不需要保持活动状态(或者如果离开容器,则只需要保持活动状态直到当前作用域结束),那么它可能比共享指针的容器简单得多(也更高效)。
q = multiset<Object*, objectcomp>::iterator();