`push_back` 到 `vector< reference_wrapper<string> >` 导致索引 0 处的字符串为空
`push_back` to `vector< reference_wrapper<string> >` cause string at index 0 to be empty
我有两个类,这是一个没有覆盖的直接继承,所以它们基本上是:vector<string> list
和vector< reference_wrapper<string> > filtered
。我的想法是我想将所有值存储到 list
中,然后用从 list
.
中选择的数据填充 filtered
现在,当我 filtered.push_back()
如果它的大小为 1,索引 0 处的引用将 return 一个空字符串(长度 = 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
如果触发增长操作,push_back
到矢量会使所有先前的 references/pointers/iterators 无效,并且在增长后尝试使用它们是未定义的行为。
在你的情况下,第二个 list.push_back(line);
实际上触发了增长,使 filtered
中的前一个 reference_wrapper
无效。当您尝试访问它们时,您正在调用未定义的行为。
如果你想以这种方式使用,你必须确保 vector
有足够的 space,这样就不会触发增长操作。
我有两个类,这是一个没有覆盖的直接继承,所以它们基本上是:vector<string> list
和vector< reference_wrapper<string> > filtered
。我的想法是我想将所有值存储到 list
中,然后用从 list
.
filtered
现在,当我 filtered.push_back()
如果它的大小为 1,索引 0 处的引用将 return 一个空字符串(长度 = 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
push_back
到矢量会使所有先前的 references/pointers/iterators 无效,并且在增长后尝试使用它们是未定义的行为。
在你的情况下,第二个 list.push_back(line);
实际上触发了增长,使 filtered
中的前一个 reference_wrapper
无效。当您尝试访问它们时,您正在调用未定义的行为。
如果你想以这种方式使用,你必须确保 vector
有足够的 space,这样就不会触发增长操作。