gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:19:13 25 4
gpt4 key购买 nike

考虑以下代码:

#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() .
这将返回一个指向空列表开头的指针。为了让您想要的代码像宣传的那样工作,*iter++输出迭代器的操作必须向列表中添加新值 .
不幸的是,不管你对 begin() 返回的迭代器做什么。 ,您对它所做的任何事情都不会使列表比原来更大或更小。它只是迭代 现有内容的名单。
在这一点上,您几乎处于未定义的行为领域,您得到的任何结果都将是完全荒谬的(如果不是立即崩溃)。
而不是传入 v.begin() ,您需要use std::back_insert_iterator instead .

关于c++列表在设置差异后不调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68217401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com