Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 如何正确地遍历常量集?_C++_Iterator_Constants - Fatal编程技术网

C++ 如何正确地遍历常量集?

C++ 如何正确地遍历常量集?,c++,iterator,constants,C++,Iterator,Constants,我正在做一个程序,它应该代表一个图形。我的问题在于printAdjacencyList函数。基本上,我有一个图形ADT,它有一个成员变量nodes,它是该图形中节点的映射。每个节点都有一组与其连接的边*的边。我试图遍历图中的每个节点和节点的每条边 void MyGraph::printAdjacencyList() { std::map<std::string, MyNode*>::iterator mit; std::set<MyEdge*>::iterator sit

我正在做一个程序,它应该代表一个图形。我的问题在于printAdjacencyList函数。基本上,我有一个图形ADT,它有一个成员变量nodes,它是该图形中节点的映射。每个节点都有一组与其连接的边*的边。我试图遍历图中的每个节点和节点的每条边

void MyGraph::printAdjacencyList() {
std::map<std::string, MyNode*>::iterator mit;
std::set<MyEdge*>::iterator sit;

for (mit = nodes.begin(); mit != nodes.end(); mit++ ) {
    std::cout << mit->first << ": {";
    const std::set<MyEdge*> edges = mit->second->getEdges();
    for (sit = edges.begin(); sit != edges.end(); sit++) {
        std::pair<MyNode*, MyNode*> edgeNodes = *sit->getEndpoints();
    }
}
std::cout << " }" << std::endl;
}
GetEdge声明为:

const std::set<MyEdge*>& getEdges() { return edges; };
const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };
get端点声明为:

const std::set<MyEdge*>& getEdges() { return edges; };
const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };
我得到的编译器错误是:

MyGraph.cpp:63: error: request for member `getEndpoints' in 
`*(&sit)->std::_Rb_tree_const_iterator<_Tp>::operator->
[with _Tp = MyEdge*]()', which is of non-class type `MyEdge* const'

MyGraph.cpp:63: warning: unused variable 'edgeNodes'
我发现这可能意味着我在某个地方滥用了const,但我不知道我的生活在哪里。如有任何信息,将不胜感激。谢谢

尝试将sit更改为常量迭代器。当你在做的时候,把mit也改成常量迭代器。此外,GetEdge和getEndpoints应该是。最后,由于运算符->的优先级高于一元运算符*,因此您可能希望在内部循环中使用edgeNodes=*sit->getEndPoints

不是一个问题,但是你应该考虑将迭代器实例作为循环的局部变量。

尝试将SIT转换成一个迭代器。当你在做的时候,把mit也改成常量迭代器。此外,GetEdge和getEndpoints应该是。最后,由于运算符->的优先级高于一元运算符*,因此您可能希望在内部循环中使用edgeNodes=*sit->getEndPoints

不是一个问题,但您应该考虑将迭代器实例作为循环的局部变量。

S/STD::SET::迭代器SIT;std::set::const_迭代器sit/

麻省理工学院也是如此。换句话说,这里需要的是常量迭代器。

s/std::set::iterator sit/std::set::const_迭代器sit/


麻省理工学院也是如此。换句话说,这里需要的是常量迭代器。

如果没有可编译的东西,很难确定任何东西,但是

const std::set<MyEdge*>& getEdges() { return edges; };

技术上应该是const方法,因为它们不修改类并返回const引用

const std::set<MyEdge*>& getEdges() const { return edges; };
const std::pair<MyNode*, MyNode*>& getEndpoints() const { return nodes; };
这与const_迭代器相结合可能会解决您的constness问题


然而,您的特殊错误可能是*it->foo=*it->foo不同于*it->foo

如果没有可编译的东西,很难说出任何明确的东西,但是

const std::set<MyEdge*>& getEdges() { return edges; };

技术上应该是const方法,因为它们不修改类并返回const引用

const std::set<MyEdge*>& getEdges() const { return edges; };
const std::pair<MyNode*, MyNode*>& getEndpoints() const { return nodes; };
这与const_迭代器相结合可能会解决您的constness问题



然而,你的错误可能是*it->foo=*it->foo不同于*it->foo

,除非你做这个项目是为了做作业或是为了好玩,我建议你只使用boost库图形表示法。是的,这是一个类的作业,所以没有boost niceness=@Jared祝你好运,那么:,你可以考虑用“家庭作业”标签来标注这些问题,这样人们就会知道。贾里德·阿米尔不用担心。如果你不使用BGL,你会很感激避免了很多头痛。从您自己的模拟图功能移动到BGL就像从stdio.h移动到iostream一样。有一天你可能会为此而感激,但在那之前,从你嘴里出来的诅咒字的数量不会让一个英国足球迷感到羞愧。你说过节点是一个映射,但是在getEndpoints中,你将其作为std::pair返回。这是怎么回事?除非你在做这个作业,或者是为了好玩,我建议你只使用助推库图形表示。是的,这是一个班的作业,所以没有升序尼斯= @贾里德好运,然后:你也可以考虑用“作业”标签来标记这些问题。所以人们会知道的。@Jared@Amir别担心。如果你不使用BGL,你会很感激避免了很多头痛。从您自己的模拟图功能移动到BGL就像从stdio.h移动到iostream一样。有一天你可能会为此而感激,但在那之前,从你嘴里出来的诅咒字的数量不会让一个英国足球迷感到羞愧。你说过节点是一个映射,但是在getEndpoints中,你将其作为std::pair返回。这是怎么回事?我将两个迭代器都更改为const_迭代器,错误完全相同。我将两个迭代器都更改为const_迭代器,错误完全相同。我将两个迭代器都更改为const_迭代器,并将GetEdge和getEndpoints重新定义为const函数,编译器错误没有任何更改。@Jared我更新了答案。我认为这些更改应该会让编译器平静下来。如果在这些更改之后仍然出现这些错误,那么如果将这些访问器的返回类型更改为按值返回,而不是按常量引用返回,会发生什么情况?最后一条注释在*sit->getEndpoints建议之前。这就解决了我的问题,谢谢!我已将两个迭代器都更改为常量迭代器,并将GetEdge和getEndpoints重新定义为常量函数,编译器错误没有更改。@Jared我更新了答案。我认为这些改变应该让编译器平静下来
这些错误之后,如果将这些访问器的返回类型更改为按值返回,而不是按常量引用返回,会发生什么情况?最后一条注释在*sit->getEndpoints建议之前。这就解决了我的问题,谢谢*它->福成功了!帕伦夫妇到底做什么?只需告诉编译器将取消引用的迭代器视为对象即可?它们会更改优先级。->运算符的优先级高于*运算符,因此首先对其求值。但是您需要首先计算*值,因此您可以将它与括号内的操作数一起括起来。*it->foo完成了这项任务!帕伦夫妇到底做什么?只需告诉编译器将取消引用的迭代器视为对象即可?它们会更改优先级。->运算符的优先级高于*运算符,因此首先对其求值。但是您需要首先计算*值,因此可以将它与括号内的操作数一起括起来。