【问题标题】:stl set iteratorstl 设置迭代器
【发布时间】:2012-03-16 04:14:05
【问题描述】:

我有一个带有 Cell 类对象的 stl 集

class Cell
{
public:
    //Ctor/Dtor
    Cell(size_t cellId=0,int x =0,int y = 0,size_t t = 0):m_cellId(cellId),m_x(x),m_y(y),m_t(t),m_color(WHITE),m_pCellId(0),m_regNum(0){}
    ////////////////////
    //    Mutators    //
    ////////////////////
    void schedNode(size_t t,int nodeId){m_sched[t] = nodeId;}
    void setColor(color c){m_color = c;}
    void setParentId(size_t pId){m_pCellId = pId;}
         //.....
}

每个Cell 都有m_xm_y(成员)坐标+其他数据成员(m_t,m_color,m_pCellId,m_regNum

comapareCells 类用于仅根据其实际 m_x 和 m_y 坐标来查找单元格:

class comapareCells
{
public:
    bool operator()(const Cell& lCell,const Cell& rCell)
    {
        if(lCell.getX() < rCell.getX())
            return true;
        else if(lCell.getX() == rCell.getX())
            return (lCell.getY() < rCell.getY());
        else
            return false;
    }

};

我运行以下命令来查找“实际单元格”: c 是一个只需要单元格坐标的单元格。它用于在给定坐标的情况下找到包含在 cet 中的实际单元格,并尝试对实际单元格进行一些操作:

set<Cell,comapareCells>::iterator itCell;
    if((itCell = m_cells.find(c)) == m_cells.end())
        return;
    if(itCell->getColor() != WHITE)
        return;
    itCell->setColor(GRAY);
    itCell->setParentId(cIdFrom);

我收到itCell-&gt;setColor(GRAY); itCell-&gt;setParentId(cIdFrom); 的编译错误:

无法将“this”指针从“const Cell”转换为“Cell &”

如何解决?

【问题讨论】:

标签: c++ stl iterator set


【解决方案1】:

通过迭代器更改set 的元素的值是不合法的,因为set 无法知道您更改了什么并且会使它无效。如果您想像那样更改它,则必须将其删除并与您的更改一起重新插入。

Cell newCell(*itCell);
newCell.setColor(GRAY);
m_cells.erase(itCell);
m_cells.insert(newCell);

【讨论】:

  • 貌似是stl::set实现设计中的一个bug……比如我可以通过迭代器stl::vector来改变。迭代器的作用是获取容器的实际对象。
  • 是的,但是如果您更改 vector 中某些内容的值并不重要。 set 需要确切知道其中的内容才能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多