c ++列表在设置差异后不调整大小

c++ list not resizing after set difference

考虑以下代码:

#include <algorithm>
#include <iostream>
#include <list>

int main() {
    std::list<int> v = {1, 3, 4};
    std::cout << v.size() << std::endl;
    v.resize(0);
    std::cout << v.size() << std::endl;
}

编译输出后,如预期的那样,是

3
0

现在我加个差价

#include <algorithm>
#include <iostream>
#include <list>

int main() {
    std::list<int> x = {1, 3, 4};
    std::list<int> y = {1, 2, 3, 5};
    std::list<int> v;
    x.sort();
    y.sort();
    std::cout << v.size() << std::endl;
    auto it =
        std::set_difference(x.begin(), x.end(), y.begin(), y.end(), v.begin());
    std::cout << v.size() << std::endl;
    v.resize(0);
    std::cout << v.size() << std::endl;
}

输出为

0
4
4

为什么调整大小对第一个示例有效,但对第二个示例无效?

这是因为它是未定义的行为。

std::set_difference 的最后一个参数是一个输出迭代器。您正在传递 v.begin().

此 returns 指向空列表开头的指针。为了使您的预期代码像宣传的那样工作,输出迭代器 *iter++ 操作必须向列表 添加新值。

不幸的是,无论您对 begin() 返回的迭代器做什么,您对它做的任何事情都不会使列表比现在更大或更小。它只是迭代列表的现有内容

在这一点上,你几乎处于未定义的行为领域,你得到的任何结果都将是完全荒谬的(如果不是立即崩溃的话)。

您需要 use std::back_insert_iterator instead.

而不是传入 v.begin()