C ++代码,只读变量不可分配

时间:2014-02-09 22:51:22

标签: c++

这是C ++代码。我很困惑为什么解引用迭代器告诉我变量是只读的?它是Node类的公共成员。我的错误是什么?

adjTable是一组Node元素 - 请参见下面的声明。

Cells::iterator pos = adjTable.find(*thisNode);
if (pos == adjTable.end()) { // Did we find it?
    NSLog(@"Not found");
// What to do here if node not found
}
// We found the node - mark it as grey in the table
(*pos).colour = grey; // <<<<<<<< this is the line with the issue

以下是声明等(它似乎没有正确格式化)

class Node { // Define a single node a.k.a. matrix cell
public:
    short nodeID;           // the tag from the cell
    short colour;           // for tri-colour used in traversing
    std::vector<short>adjs; // nodeIDs of adjacent nodes

    // Ctors
    Node(){};
    Node(short ID, short col, std::vector<short>adjs)
        : nodeID(ID), colour(col), adjs(adjs){}
    // Dtors
    ~Node(){};
    // operators
    bool operator<(const Node& rhs) const{
        return nodeID < rhs.nodeID;
    }
    bool operator==(const Node& rhs) const{
        return nodeID == rhs.nodeID;
    }
};

typedef std::set<Node,SortNodeSet> Cells;
class MakeTable {
public:
    MakeTable(){};
    ~MakeTable(){};
    Cells makeTable();
};

3 个答案:

答案 0 :(得分:1)

std::set的元素是不可变的。所以你不能修改它们。如果您希望能够修改它们,则需要不同的数据结构。

答案 1 :(得分:1)

更改地图或集合的键可能会导致未定义的行为,因为您的地图/集取决于维护顺序的键值。如果您的SortNodeSet函数/仿函数未使用colour字段,这可能是图表算法中的逻辑选择,则可以将此字段定义为mutable字段,即

mutable short colour;

这告诉编译器如果更改colour字段,则不会将节点视为已更改。

答案 2 :(得分:0)

由于您的比较仅基于ID,因此您可能希望使用std::map<short, Node>启用基于ID的查找。

然后,创建nodeID成员变量const,因为更改ID会破坏查找。