`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
имеет достаточно места, чтобы операция запуска не была запущена.