关于一个C++程序中迭代器iterator出现的报错,求指导答

C++语言 码拜 4年前 (2016-09-24) 578次浏览
for (int d = 0; d < COUNT_OF(dir); d++)
		{
			ANODE nn = { cur_node.i + dir[d].y,cur_node.j + dir[d].x,0,0 };//在当前节点u四个方向的节点
			if ((nn.i >= 0) && (nn.i < N_SCALE) && (nn.j >= 0) && (nn.j < N_SCALE) && (gc->cell[nn.i][nn.j].type != CELL_WALL) && !IsNodeExistInClose(graph->close, nn.i, nn.j))
			{
				std::multiset<ANODE, compare>::iterator it;
				it = find(graph->open.begin(), graph->open.end(), nn);//在open中找nn
				if (it == graph->open.end()) //nn不在open列表
				{
					nn.g = cur_node.g + 1;				//计算nn的实际代价g
					nn.h = dist_func(nn, graph->target);//计算nn的评估函数h
					//将nn前驱结点设置为cur_node
					nn.prev_i = cur_node.i;
					nn.prev_j = cur_node.j;
					//将nn加入open
					graph->open.insert(nn);
					gc->cell[nn.i][nn.j].processed = true;
				}
				else//nn在open中
				{
					if ((cur_node.g + 1.0) < it->g) {
						it->g = cur_node.g + 1.0;
						it->prev_i = cur_node.i;
						it->prev_j = cur_node.j;
					}
				}
			}

代码是A*寻路算法的一部分,可是在最后给it->g、it->prev_i、it->prev_j赋值时提示it是个常量。问一下问题出在哪,应该怎么修改
本人用的是visual studio 2015版,请高手指点一下

解决方案

10

对于一个 set/multiset ,它的 iterator 总是 const 的,原因是修改其储存对象的值可能导致它在 set 中应有的位置发生变化

5

换其他容器吧。

20

要修改set容器中的值,只能删了,再重新插入要的值

8

VS IDE中,在不清楚的符号上点鼠标右键,选转到定义。

5

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

2

迭代器你可以粗略的理解为一个指针,换容器吧

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于一个C++程序中迭代器iterator出现的报错,求指导答
喜欢 (0)
[1034331897@qq.com]
分享 (0)