0

我有两个类,它们是没有覆盖的直接继承,所以它们基本上是: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
4

1 回答 1

4

push_back如果触发了增长操作并且尝试在增长后使用它们是未定义的行为,则 to vector 会使所有先前的引用/指针/迭代器无效。

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

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

于 2018-03-27T05:23:38.527 回答