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()
考虑以下代码:
#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()