Проблема с итерацией в std :: set (c ++) - PullRequest
2 голосов
/ 04 августа 2011

У меня проблемы с сетами весь день. Одни я могу решить, другие нет. Этот беспокоит меня с самого утра, и у меня кончилось терпение. Пожалуйста, помогите, могучий стекопоток!

Итак, у меня есть набор, который содержит мой собственный объект, который называется "vect" и основан на eigen :: matrix. Это означает, что я получаю значения из векторов с помощью оператора [].

set<vect*> *tvps=getTheSet();

for (set<vect*>::iterator iter = tvps->begin(); iter != tvps->end(); ++iter)
{
    vect v= **iter;   // Don't really know why two asterisks,
                      // but my compiler would complain
    int x=v[0];
    int y=v[1];
    doStuffWith( v[0],v[1]);

}

Теперь это скомпилирует и запустит и все. Но значения, которые я получаю от итератора, составляют 30% мусора:

x: 110   y: 90
x: 230   y: 130
x: 250   y: 100
x: 230   y: 130
x: 110   y: 290
x: 140   y: 260
x: 180   y: 280
x: 150   y: 210
x: -2147483648   y: 0
x: 180   y: 280
x: 170   y: 230
x: 240   y: 270
x: -2147483648   y: 0
x: -429917536   y: 0
x: 0   y: -2147483648

Я проверил в точке, где набор был собран, какие значения были вставлены. Только те, которые между 10 и 300 .., как и предполагалось. Как я могу найти других в этом? Я облажался с итератором?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Существует несколько вариантов того, почему это происходит с вами:

  • Вы повторно используете набор.Если да, вы clear() это между повторным использованием?
  • Вы храните указатели на векторы в наборе, вы меняете векторы внутри набора?храните указатель на вектор, потому что в противном случае компилятор выдает ошибку из-за того, что он не знает, как сравнивать два вектора.Почему бы вам не попытаться реализовать функцию сравнение и сохранить векторы напрямую?таким образом, ваша работа будет намного проще и намного менее подвержена ошибкам.

    Также проблема, с которой вы столкнулись сейчас, заключается в том, что элементы в наборе, похоже, не упорядочены ... фактическизначение указателя, а не по X и Y (и я полагаю, это то, что вы хотите)

1 голос
/ 04 августа 2011

У вас есть набор указателей на векторы. В **iter сначала вы разыменовываете итератор, затем указатель внутри.

Хранение указателей также может стать причиной вашей проблемы: если вы освободили или забыли инициализировать некоторые из них, результатом будет мусор.

...