Соответствующие (я думаю) строки моего кода приведены ниже. Имеется в виду, что есть список Кластеров. Один из них, base
, поглотит другой (aborbed
). Кластер aborbed
должен быть удален из кластера list
.
Первая проблема, с которой я столкнулся, заключалась в том, что мне нужно было выполнять другие операции в кластерах base
и absorbed
после закрытия цикла while
. В своих поисках я нашел = &(*li)
материал. Я понимаю, что я получаю указатель на адрес элемента li
, на который указывает, хотя я не могу сделать absorbed = li
, потому что один итератор, а другой (простой?) понтер. Я был бы признателен за некоторые пояснения по этому поводу.
Теперь большая проблема в том, что я получаю ошибку сегментации в строке c->getPoints();
метода joinCluster()
Что я делаю неправильно? Что мне делать и почему?
Я использую g++ (GCC) 4.5.2 в Linux x86_64.
Cluster * base;
Cluster * absorbed;
list<Cluster>::iterator li = clusters.begin();
while ( li != clusters.end() ) {
if (li->getId() == p2) {
absorbed = &(*li);
li = clusters.erase(li);
} else if (li->getId() == p1) {
base = &(*li);
}
++li;
}
base->joinCluster(absorbed);
void Cluster::joinCluster(Cluster * c)
{
set<unsigned int> pts = c->getPoints();
}
set<unsigned int> Cluster::getPoints()
{
return points;
}
class Cluster {
private:
std::set<unsigned int> points;
public:
std::set<unsigned int> getPoints();
};
++li
я уже исправил. Что касается вашего второго абзаца: когда я стираю элемент из списка, он действительно стирается из памяти? или просто вычеркнуты из списка, но доступны поштучно? 16.04.2012erase()
или сделаете копию элемента. 16.04.2012