我有两个类,它们是直接继承而没有覆盖,因此它们基本上是: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
答案 0 :(得分:4)
push_back
to vector会使所有先前的引用/指针/迭代器无效。
在您的情况下,第二个list.push_back(line);
实际上会触发增长,导致reference_wrapper
中的上一个filtered
无效。当您尝试访问它们时,您正在调用未定义的行为。
如果要以这种方式使用,则必须确保vector
有足够的空间,以便不会触发增长操作。