当我尝试将对象插入一组stl vector
中时出现此错误,Node
是我创建的类。 ¿您能向我解释如何解决此错误吗?
代码:
void car::expandnode(Node& current_node,std::set<vector<Node> >& closed_list,grid& map){
int c_a = current_node.get_x();
int c_b= current_node.get_y();
if((map.get(c_a,++c_b))!=1){
point p(c_a,++c_b);
Node ns(p,costtan);
costtan= 1+ heuristic1(ns); // cost to arrive node
if(std::find((*closed_list.end()).begin(),(*closed_list.end()).end(),ns)==((*closed_list.end()).end()))
closed_list.end()->push_back(ns); //error
}
float car::heuristic1(Nodo& successor){
int c1= successor.get_x();
int c2= successor.get_y();
float result = sqrt(pow((c1-destination_point_.get_x()),2) + pow((c2-destination_point_.get_y()),2));
return resultado;
}
错误:
error: passing ‘const std::vector<Node>’ as ‘this’ argument discards qualifiers [-fpermissive]
closed_list.end()->push_back(ns);
谢谢
EDIT1:
我正在实现A star算法,因此如果后继程序不是障碍(!=1
),则在函数expandnode中,我将其插入set
的{{1}}中包含每个节点的后继节点,我在问题中添加了更多代码以澄清我的疑问
由于我要从其他函数(主要A-star函数)调用vector
,因此我需要在expandnode()
的最后一个向量上插入每个节点的后继字符,因此我使用{{1} }的目的,因为最初每个向量都有一个节点,所以一旦调用set
,此向量就有该节点及其后继对象
答案 0 :(得分:2)
closed_list
是std::set
。存储在set
中的对象是const对象,因为修改它们可能会改变修改后的对象相对于set
中其他对象的排序方式。
当取消引用set
的迭代器时,您获得的引用是const &
。然后,当您尝试在该对象上调用push_back
时,编译器会生成错误,因为无法在push_back
对象上调用const
。
该代码的另一个问题是任何标准容器的end
迭代器都是不可引用的,并且这样做会导致未定义行为。也许您是想使用back()
来返回容器中最后一个项目的引用?
这仍然无法解决修改集合中对象的问题。为此,您需要从集合中删除对象,对其进行修改,然后重新插入修改后的对象。
答案 1 :(得分:1)
另一个问题是,set
中的所有元素默认情况下都由运算符<
进行排序。您可能需要覆盖它。