为什么在查找元素时需要使用set.find(x)!= set.end()。

时间:2017-07-15 14:37:38

标签: c++ c++11 stl c++14

我想知道使用*(set.find(x)) == x时出了什么问题 而不是set.find(x)!=set.end()。 它通常有效但在Hackerrank上尝试一个问题时(问题:link)。 此代码为所有测试用例提供CA:

int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */   

set<int>s;
int n,x,y;
cin >> n;
while(n--){
    cin >> y >> x;
    if(y==1)
        s.insert(x);
    else if(y==2)
        s.erase(x);
    else {
        set<int>::iterator it=s.find(x);
        if(it != s.end())
            cout << "Yes" <<endl;
        else cout << "No" <<endl;
    }
}
return 0;}

但这并不适用于2个测试用例。测试用例文件太大,试图检查那个巨大的文件是没用的。 : -

 #include <cmath>
 #include <cstdio>
 #include <vector>
 #include <iostream>
 #include <set>
 #include <algorithm>
 using namespace std;


 int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */

set<int>s;
int n,x,y;
cin >> n;
while(n--){
    cin >> y >> x;
    if(y==1)
        s.insert(x);
    else if(y==2)
        s.erase(x);
    else {
        set<int>::iterator it=s.find(x);
        if(*it==x)
            cout << "Yes" <<endl;
        else cout << "No" <<endl;
    }
}
return 0;
}

2 个答案:

答案 0 :(得分:10)

因为如果find返回end迭代器并且你取消引用它就会触发未定义的行为,这意味着你的程序可能会做任何事情 - 碰巧工作,工作不正常,普通崩溃。这是所有C ++容器的一般规则 - end迭代器只是“一个过去的最后一个”元素的占位符,用作循环的结束条件或表示元素不存在;你不是要取消引用它。

如果您想要一种更紧凑的方式来检查元素是否存在,只需使用set.count(x)

答案 1 :(得分:0)

问题在于

测试用例10输入

19268
3 7401  //first search without any input

如果第一个输入是3并且用于搜索元素

set<int>::iterator it=s.find(x); //Returns end iterator

当你使用end()的值时,它将返回异常

if(*it==x)