std :: map найти расстояние с итераторами, программа не завершается - PullRequest
2 голосов
/ 05 ноября 2019

Когда я компилирую (g++ -std=c++14 map.cpp) и запускаю эту программу, она, похоже, не завершается. Кто-нибудь может объяснить, почему? Однако, поскольку я нахожу («а») вместо «с», он дает ноль.

#include <iostream>
#include <string>
#include <vector>
#include <map> 
#include <algorithm>
using namespace std; 



int main()
{
    map<char, float> m;
    m['a'] = 3.4;
    m['b'] = 5.3;
    m['c'] = 33.3;
    m['d'] = 43.;

    auto it = m.find( 'c' );
    cout << "distance : " << std::distance( it , m.begin() ) << endl;

}

Ответы [ 2 ]

5 голосов
/ 05 ноября 2019

Использование

std::distance( m.begin(), it  )

В противном случае вызов

std::distance( it , m.begin() )

имеет неопределенное поведение, поскольку используется недопустимый диапазон. Диапазоны в C ++ указываются как [first, last ), где первый предшествует или равен последнему. В последнем случае, когда first равен последнему, диапазон пуст.

Из стандарта C ++ (27.4.3 Операции итератора)

4 Эффекты: Если InputIterator соответствует требованиямитератор произвольного доступа, возвращает (последний - первый);в противном случае возвращает количество приращений, необходимое для получения от первого до последнего .

3 голосов
/ 05 ноября 2019

std::distance(first,last) запускается с first и перемещает итератор до достижения last. В вашем случае это никогда не произойдет, потому что it, скорее всего, найдено после m.begin(), так что оно будет зациклено навсегда. изменить порядок заданных параметров на std::distance

std :: distance ссылка:

Поведение не определено, если lastне достижим с первого (возможно, многократно), увеличивая сначала.

...