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;
}
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)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With