При использовании стирания для удаления первого элемента вектора во время обратной итерации, это cra sh, вызванное пределами диапазона - PullRequest
0 голосов
/ 17 марта 2020

Cra sh может быть воспроизведен с помощью приведенных ниже кодов.

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int> tests;
    tests.push_back(1);
    tests.erase(tests.rbegin().base());
    return 0;
}

Если я использую обычный итератор, вызов функции стирания не вызовет cra sh. Кто-нибудь знает, что это за механизм? Я был бы признателен за объяснение.

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

1 Ответ

0 голосов
/ 17 марта 2020

С https://en.cppreference.com/w/cpp/iterator/reverse_iterator/base:

Базовый итератор относится к элементу, который является следующим (с точки зрения std::reverse_iterator::iterator_type) по отношению к элементу, на который в данный момент указывает обратный итератор , Это &*(rit.base() - 1) == &*rit.

В моем понимании это означает, что вы пытаетесь начать с последнего элемента с помощью обратного итератора, и когда вы получаете его базу, вы фактически получаете доступ к элементу ПОСЛЕ последний элемент. Это, очевидно, всегда будет за пределами диапазона.

Надеюсь, это поможет уточнить. Если я что-то неправильно понял, не стесняйтесь поправлять меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...