`push_back`到`vector&lt; reference_wrapper <string>&gt;`索引0处的字符串为空

时间:2018-03-27 05:18:57

标签: c++ reference-wrapper

我有两个类,它们是直接继承而没有覆盖,因此它们基本上是:vector<string> listvector< 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 个答案:

答案 0 :(得分:4)

如果触发了增长操作并且在增长后尝试使用它们是未定义的行为,

push_back to vector会使所有先前的引用/指针/迭代器无效。

在您的情况下,第二个list.push_back(line);实际上会触发增长,导致reference_wrapper中的上一个filtered无效。当您尝试访问它们时,您正在调用未定义的行为。

如果要以这种方式使用,则必须确保vector有足够的空间,以便不会触发增长操作。