Мой вектор не может получить доступ к элементу, который существует? - PullRequest
0 голосов
/ 24 августа 2018

Я создаю программу, которая читает данные (и возвращает каждый токен), и, если в потоке встречается определенное значение, оно заменяется другим значением или рядом других значений.

Например:

name: [name]
id:   [ID]

Должно дать:

name: Bob
id:   23 87 87 9

Вот как выглядит мой код:

token lexer::next() {
    token ret;
    if (IsData) {
        if (DataValue.empty()) IsData = false;
        else {
            ret = DataValue.front();
            DataValue.erase(DataValue.begin());
            return ret
        }
    }

    // some code to manage others tokens (a value is also assigned to 'ret')

    if (Datas.IsData(ret.value)) {
        // here, ret.value represent the '[value]' saw above
        DataValue = Datas.get(ret.value);
        IsData = true;
        return next();
    }

    return ret; // for "normal" tokens

}

DataValue это просто std::vector<token>. И каждый раз мы возвращаем первый элемент, который затем удаляется, пока его больше нет.

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

enter image description here

Я не понимаю ... Единственное допущение, которое у меня есть, состоит в том, что, поскольку функция не может возвращать более одного токена за раз, она посягает на другие вызовы (потому что de value для замены может считать больше 1 токена ). Но я не уверен.

Есть идеи?

1 Ответ

0 голосов
/ 24 августа 2018

Если я правильно следую вашему объяснению и вашему коду, кажется, что эта строка является виновником:

DataValue = Datas.get(ret.value);

DataValue - вектор, содержащий многократные элементы;Вы удалили первый (с .erase(DataValue.begin())), теперь вы должны вставить его вместо него.

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

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

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