Lower_bound дает другой результат - PullRequest
0 голосов
/ 30 января 2020

тестирование функции lower_bound в c ++ Я получаю странный результат после запуска этого кода в Ideone. Что я делаю неправильно? здесь правильно использовать авто?

код:

    vector<int> a(5);
    a.clear();
    rep(i,0,5){
        a[i]=i+1;
        cout<<a[i]<<' ';
        }
    cout<<endl;
    auto pos = lower_bound(a.begin(),a.end(),3);
    cout<< (pos-a.begin())<<'\n';

вывод:

1 2 3 4 5 
0

Почему ?? ожидаемый результат:

2

Что я делаю не так, не понимаю. похоже на базовый c C ++ код

Ответы [ 2 ]

7 голосов
/ 30 января 2020

Эта строка создает вектор из пяти элементов:

vector<int> a(5);

Следующая строка удаляет все пять элементов, устанавливая размер в ноль:

a.clear();

Следовательно, l oop записывает за end() вектора, вызывая неопределенное поведение. Это не расширяет вектор.

На практике вы вызываете lower_bound в пустой последовательности, поэтому pos == a.begin(). Удалите вызов на clear(), чтобы решить проблему.

3 голосов
/ 30 января 2020

Ваш код имеет неопределенное поведение .

Вы создаете std::vector с 5 int с, , а затем вы clear() вектор , который устанавливает его размер обратно в 0.

Затем вы запускаете al oop, который обращается к векторным элементам, которые находятся за пределами размера вектора. На данный момент ваш код имеет неопределенное поведение . Может произойти все, что угодно. Ваш код может взломать sh. Ваш код может повредить память.

Затем вы вызываете std::lower_bound() для пустого вектора, поэтому он возвращает итератор end, который совпадает с итератором begin, поэтому расстояние между ними равно 0, что вы и распечатываете.

Вам нужно просто избавиться от вызова на clear(), тогда ваш код будет работать так, как вы ожидаете.

...