关于list iterators incompatible/vector iterators incompatible 报错总结

STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件,如果你使用容器不当,就会发生list 
iterators  incompatible/vector iterators  incompatible 的错误,报错如图:

如果你trace代码,你可以看到如下代码:

	bool operator==(const _Myiter& _Right) const
		{	// test for iterator equality
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (this->_Getcont() == 0
			|| this->_Getcont() != _Right._Getcont())
			{	// report error
			_DEBUG_ERROR("list iterators incompatible");
			_SCL_SECURE_INVALID_ARGUMENT;
			}

 #elif _ITERATOR_DEBUG_LEVEL == 1
		_SCL_SECURE_VALIDATE(this->_Getcont() != 0
			&& this->_Getcont() == _Right._Getcont());
 #endif /* _ITERATOR_DEBUG_LEVEL */

		return (this->_Ptr == _Right._Ptr);
		}

	bool operator!=(const _Myiter& _Right) const
		{	// test for iterator inequality
		return (!(*this == _Right));
		}
	};

这个错误是“list iterators incompatible”,提示向量与迭代器不兼容,但是这很明显是不可能的(除非你故意这么做);如果你对容器操作不熟悉,你可能犯一下错误:

One:类型不匹配,例如用int型的向量迭代器与char型的向量迭代器进行比对操作。犯此错误的几率不大,除非你的自己的程序架构都不熟悉,并且不知道自己在做什么;

Two: 比对时容器的结构发生变化,例如:

for (vector<int>::iterator i= vector.begin();  i != vector.end();   i++)

{

vector.erase(i);

}

在erase操作后,没有将循环变量i指向修改后的向量迭代器,就继续循环,再与end()比较时断言出现。 解决方法是将“vector.erase(i);”替换为“i = vector.erase(i);”,这是因为STL里的所有容器类中的erase实现都会返回一个迭代器,这个迭代器指向了“当前删除元素的后继元素,或是end()”。

Three:将容器以参数的的形式,并且与实参相比较,应该用实参的引用,因为对于引用时实参的一个别名,是同一个变量,而已参数传递的是实参的副本,详情可以参考(c++ primer 关于引用章节,可以深入体会),这样做也可以提高程序的效率,减少了构造/析构函数的开销,这也是一种良好的编程习惯,曾经自己在此吃过苦头!



时间: 2024-12-06 00:31:33

关于list iterators incompatible/vector iterators incompatible 报错总结的相关文章

vector iterators incompatible

字面翻译迭代器类型不兼容 今天同事遇到的这个问题算是一个习惯性写法的问题.描述一下代码: struct Track{}; class BaseTrack { - std::vector<Track> GetTrackSourceList(); - }; 问题所在: void func(BaseTrack bt) std::vector<Track>::iterator it = bt.GetTrackSourceList().begin(); for(; it != bt.GetT

Cocos2d-x Vector——vector iterators incompatible

***************************************转载请注明出处:http://blog.csdn.net/lttree****************************************** 使用 cocos2d-x 中的 Vector的时候, 在删除某个对象的时候出现了个错误,很崩溃啊..... Vector<Bullet*>* bullets; // 遍历每个bullet,让他们自己更新 for ( auto it = bullets->be

hadoop启动,DataNode报错”Incompatible clusterIDs“

启动namenode,通过50070端口查看,发现livenode只有一个--namenode,查看datanode日志,发现有”Incompatible clusterIDs“错误,提示很明显,namenode和datanode的集群id不一致 解决办法:找到core-site.xml配置文件,进入”dfs.datanode.data.dir“配置项下的目录,在current目录下有一VERSION文件,比较namenode和datanode里这个文件中的clusterID,发现不一致,因此只

mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by

在mysql 工具 搜索或者插入数据时报下面错误: ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database_tl.emp.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with s

is incompatible with i386:x86-64 output报错

在[一个操作系统的实现]书中,第五章,开始编译elf文件格式的操作系统内核. 将hello.asm编译为hello.o,再编译为可执行文件 编译hello.o时,nasm报错is incompatible with i386:x86-64 output. 原因是原实验是在32位操作系统下做的,使用的库也是32位的,而现在使用的64位操作系统. 解决方法: 修改上述两步编译的写法: nasm -f elf64 -g -F stabs sandbox.asm -o sandbox.o ld -o s

git同步遇到报错“fatal: unable to access &#39;https://github.com/ruanwenwu/newp.git/&#39;: Peer reports incompatible or unsupported protocol version.”

git同步遇到报错"fatal: unable to access 'https://github.com/ruanwenwu/newp.git/': Peer reports incompatible or unsupported protocol version." 网上很多人说是因为git版本需要升级.我将git版本升级到最新, [[email protected] tp5test]# git --version git version 2.16.2 问题却依然存在. 最后: y

git同步遇到报错“fatal: unable to access &#39;https://github.com/lizhong24/mysite2.git/&#39;: Peer reports incompatible or unsupported protocol version.”

git同步遇到报错"fatal: unable to access 'https://github.com/lizhong24/mysite2.git/': Peer reports incompatible or unsupported protocol version." 解决办法: yum update -y nss curl libcurl 问题解决了. git同步遇到报错"fatal: unable to access 'https://github.com/liz

解决报错Could not satisfy explicit device specification &#39;&#39; because the node was colocated with a group of nodes that required incompatible device &#39;/device:GPU:0&#39;

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))改为如下:sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)) 备注:allow_soft_placement=True表示当没有GPU实现可用时,使用将允许TensorFlow回退到CPU. 解决报错Could not sati

mysql报错this is incompatible with sql_mode=only_full_group_by

1.报错信息 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'd.total_rated_power_transformer'; this is incompatible with sql_mode=only_full_group_b