stl set iterator - PullRequest
       16

stl set iterator

1 голос
/ 26 февраля 2012

У меня есть набор stl с объектами класса Cell

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_x и m_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->setColor(GRAY); itCell->setParentId(cIdFrom);:

не может преобразовать указатель 'this' из 'const Cell' в 'Cell &'

Как это можно решить?

1 Ответ

5 голосов
/ 26 февраля 2012

Не разрешено изменять значение элементов set через итератор, потому что set не может узнать, что вы изменили, и сделает его недействительным. Если вы хотите изменить его таким образом, вам придется удалить его и вставить заново с вашими изменениями.

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