ошибка удаления карты - PullRequest
0 голосов
/ 15 марта 2012

У меня есть программа для различных операций на картах.

и пример кода моей программы приведен ниже.

во время выполнения этого кода я получаю сообщение об ошибке типа удаления карты вне диапазона.

, пожалуйста, помогите мне решить эту проблему.

  int main( )
  {
    using namespace std;
    map <int, int> m1;

    map <int, int> :: iterator m1_Iter;
    map <int, int> :: const_iterator m1_cIter;
    typedef pair <int, int> Int_Pair;

    m1.insert ( Int_Pair ( 1, 10 ) );
    m1.insert ( Int_Pair ( 2, 20 ) );
    m1.insert ( Int_Pair ( 3, 30 ) );

    m1_cIter = m1.end( );
    m1_cIter--;
    cout << "The value of the last element of m1 is:\n" 
      << m1_cIter -> second << endl;

    m1_Iter = m1.end( );
    m1_Iter--;
    m1.erase ( m1_Iter );

            m1_cIter = m1.begin( );
    m1_cIter--;
    m1.erase ( m1_cIter );

    m1_cIter = m1.end( );
    m1_cIter--;
    cout << "The value of the last element of m1 is now:\n"
      << m1_cIter -> second << endl;
    getchar();
  }

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Вы пытаетесь стереть элемент, расположенный до вашего первого элемента, на что это будет указывать?


Соответствующий фрагмент из размещенного кода:

 m1_cIter = m1.begin( );
 m1_cIter--;
 m1.erase ( m1_cIter );

Примечание - мне кажется довольно странным, что вы можетескомпилируйте и запустите предоставленный фрагмент вообще.

Это должно привести к ошибкам, связанным с тем, что вы не можете стереть элемент через std::map<int,int>::const_iterator, который является типом m1_cIter.

1 голос
/ 15 марта 2012
m1_cIter = m1.begin();
m1_cIter --;

- неопределенное поведение.Вы имели в виду

m1_cIter = m1.end();
m1_cIter --;
0 голосов
/ 15 марта 2012

m1.erase ( m1_cIter );

Это может быть проблемой, поскольку m1_cIter является const_iterator.Код не будет компилироваться.

После комментирования этой строки я получаю следующий вывод:

 ./maptest
The value of the last element of m1 is:
30
The value of the last element of m1 is now:
20

Также в вашем коде:

m1_cIter = m1.begin( );
m1_cIter--;

Это может быть неопределенным поведением, не гарантируется работа всегда.

...