`push_back` to `vector<reference_wrapper <string>>`приводит к тому, что строка в индексе 0 становится пустой

У меня есть два класса, которые являются прямым наследованием без переопределения, поэтому они в основном: vector<string> list а также vector< reference_wrapper<string> > filtered, Идея в том, что я хочу сохранить все значения в list а затем заполните filtered с выбранными данными из list,

Теперь, когда я делаю filtered.push_back() если он имеет размер 1, ссылка в индексе 0 вернет пустую строку (длина = 0).

// concept code
int main() {
    vector<string> list;
    vector< reference_wrapper<string> > filtered;

    string line;
    for (;;) {
        if (!getline(cin, line, '\n').good()) {
            cout << "Bad input! Exiting..." << endl;
            break;
        } else if (line.length() > 0) {
            break;
        } else {
            list.push_back(line);
            //   filtered[0].length() NOT 0 (size() = 1)
            filtered.push_back(list.back());
            //   filtered[0].length() is now 0
        }

        // then print to screen... cout
    }

Почему это происходит?


Вот пример:

// cout when size() = 1
[1] Hello world

// cout when size() = 2
[1] 
[2] Hi!

// cout when size() = 3
[1] 
[2] Hi!
[3] My world

1 ответ

Решение

push_back вектор делает недействительными все предыдущие ссылки / указатели / итераторы, если запущена операция увеличения, и попытка использовать их после роста является неопределенным поведением.

В вашем случае 2-й list.push_back(line); на самом деле вызывает рост, делая предыдущий reference_wrapper в filtered недействительным. Пока вы пытаетесь получить к ним доступ, вы вызываете неопределенное поведение.

Если вы хотите использовать таким образом, вы должны убедиться, что vector имеет достаточно места, чтобы операция запуска не была запущена.

Другие вопросы по тегам