gpt4 book ai didi

C++ 标准 :search behavior or restriction

转载 作者:太空狗 更新时间:2023-10-29 21:14:51 24 4
gpt4 key购买 nike

我正在研究 std::search(以确定 std::set 之间是否存在重复项),但我不理解输出结果。

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

int main()
{
set<int> a{9,10,11,12};
set<int> b{11,12,13};
auto it = search(a.begin(), a.end(), b.begin(), b.end());

if (it != a.end())
cout << "Common is " << *it << endl;
else
cout << "Oops " << *it << endl;
return 0;
}

所以我预计 *it 会是 11,但事实证明 it!=a.end() 失败并且 *it 打印一些不相​​关的值(这里是 4),我想我可能搞砸了。

但是,当我将 b 分配给 {11,12} 时,一切都按预期工作并打印出 "Common is 11"。再试几次后,我再也看不懂图案了。

不知道std::search有没有这种限制,也找不到答案。我很困惑。

最佳答案

如果您阅读 documentation ,您会注意到 search() 正在寻找一个整个子序列

所以在这里:

set<int> a{9,10,11,12};
set<int> b{11,12,13};
auto it = search(a.begin(), a.end(), b.begin(), b.end());

我们不是在 a< 中寻找任何 111213/。我们正在按顺序寻找所有它们。由于它们并非全部按顺序出现(a 没有 13),您得到 a.end()。请注意,取消引用结束迭代器,就像您在 Oops 案例中所做的那样,是未定义的行为。

However, when I assign b to {11,12}, everything works as expected

是的,因为现在整个序列出现在 a 中。


如果要查找任何元素,只需使用find_if:

auto it = find_if(a.begin(), a.end(), [&](int i){ return b.count(i); });

关于C++ 标准 :search behavior or restriction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39549062/

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