gpt4 book ai didi

c++ - 以下代码是否使用 std::set "legal"?

转载 作者:太空狗 更新时间:2023-10-29 19:38:23 25 4
gpt4 key购买 nike

我有这个代码:

set<int>::iterator new_end = 
set_difference(set1.begin(), set1.end(),
set2.begin(), set2.end(),
set1.begin());
set1.erase(new_end, set1.end);

它在 visual studio 中编译和运行良好。然而,在 previous question ,人们说 set 的迭代器应该是 const。我在标准中没有看到类似的东西。谁能告诉我它在哪里说的,或者这是明确定义的行为吗?

如果不是,请提供满足我需要的代码。有没有办法在不创建临时集的情况下做到这一点?

最佳答案

您的代码违反了 set_difference 的一些不变量。来自 Josuttis Book 的第 420 页:

  • 调用者必须确保目标范围足够大或使用插入迭代器。
  • 目标范围不应与源范围重叠。

您正试图写回第一组,这是不允许的。您需要在源范围以外的地方编写 - 为此我们可以使用第三组:

std::set<int> set3;
std::set_difference(set1.begin(), set1.end(),
set2.begin(), set2.end(),
std::inserter(set3, set3.begin()));

std::inserter 的第二个参数是元素插入位置的提示。不过,这只是一个提示,请放心,这些元素最终会出现在正确的位置。 set3 最初是空的,所以 begin() 是我们可以给出的唯一提示。

在调用 set_difference 之后,set3 将包含您在原始代码中尝试让 set1 包含的内容。如果愿意,您可以继续使用 set3 或将其swapset1

更新:

我不确定这样做的性能如何,但如果你只是想从 set1 中删除出现在 set2 中的所有元素,你可以尝试:

for (std::set<int>::iterator i = set2.begin(); i != set2.end(); ++i)
{
set1.erase(*i);
}

关于c++ - 以下代码是否使用 std::set "legal"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/912469/

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