Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is it necessary to to use set.find(x) != set.end() while finding an element.

Tags:

c++

c++11

stl

c++14

I am wondering what is wrong when I use *(set.find(x)) == x instead of set.find(x)!=set.end(). It usually works but while attempting a question on Hackerrank (question : link). This code gives CA for all test cases :

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;}

But this doesn't work for 2 test cases. The test case file is too big and it's no use trying to check that huge file. :-

 #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;
}
like image 481
Shreya Sharma Avatar asked Jul 15 '17 14:07

Shreya Sharma


1 Answers

Because if find returns the end iterator and you dereference it you are triggering undefined behavior, which means that your program may do whatever - happen to work, work incorrectly, plain crash. This is a general rule of all C++ containers - the end iterator is just a placeholder for a "one past last" element, used as an end condition for loops or to signal that an element does not exist; you aren't meant to dereference it.

If you want a more compact way to check if an element is present, just use set.count(x).

like image 76
Matteo Italia Avatar answered Oct 05 '22 05:10

Matteo Italia