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
迭代器你可以粗略的理解为一个指针,换容器吧