Карта С ++ не возвращает end (), хотя должна - PullRequest
0 голосов
/ 29 февраля 2012

В моем коде у меня есть карта (tBoxes) с vector<int> ключом начала и set< pair<int,int> > значением.

По какой-то причине происходит сбой программы с ошибкой сегментации, когда я пытаюсь получить доступ к определенному элементу карты, который пуст.Если я запускаю программу через valgrind, все в порядке (вот почему я знаю, что элемент пуст).Кроме того, valgrind не сообщает об утечке памяти.Цикл, который я использую, наивный:

map<vector<int>,set<int, int> > tBoxes;


/*populate boxes*/

vector<int> t(3,0);
set<pair<int, int> >::iterator it;

for(int i = mini; i <= maxi; i++){
  t[0] = i;
  for (int j = minj; j <= maxj; j++){
    t[1] = j;
    for (int k = mink; k <= maxk; k++){
      t[2] = k;
      it = tBoxes[t].begin();
      while (it != tBoxes[t].end()){
        it++;
      }
    }
  }
}

Edit:

Код не является прямым копированием из моего файла, так как я использую странные имена переменных.Я подозреваю, что это проблема с распределением памяти карты, но я не знаю, как это исправить.Кроме того, значение равно set, а не vector.

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012
for (int k = mink; k <= maxj; k++){ // should'n it be maxk?

Старая ошибка «скопировать и вставить для»: D

РЕДАКТИРОВАТЬ: Op изменил код и исправил то, что я указал, так что этот ответ больше не действителен ...

0 голосов
/ 01 марта 2012

EDIT: завершите перезапись, чтобы вставить int в набор целых чисел, которые затем вставляются в карту векторов целых множеств. (Sic.) Затем извлекая оригинал int.

int main( int argc, char *argv )
{
    map< vector<int>, set<int> > tBoxes;

    vector<int> vecInsert( 3, 0 );
    set<int> setInsert;
    setInsert.insert( 666 );

    tBoxes.insert( std::make_pair( vecInsert, setInsert ) );

    ///////////////////////////////////////////////////////////

    vector<int> vecLookup( 3, 0 ); //identical to vecInsert
    set<int> setLookup =  tBoxes[vecLookup]; //the set mapped by the 'key' vector above
    set<int>::iterator iter = setLookup.begin(); //the first element in the set

    if( iter != setLookup.end() )
    {
        int i = *iter;
        if( i == 666 )
        {
            //eureka!!
        }
    }

    return 0;

}
...