This is a short code which I wrote and it only printed '1' and not "Hello World" but when I did typecasting in if statement i.e if((int) it->second.size() > x)
then it worked completely fine. Now if typecasting is the solution then why this line always works " for (int i=0;i < v.size(); i++)
". Please can anyone explain this behaviour ?
Your code here...
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,set<int>> m;
m[0].insert(1);
int x = -1;
for(auto it=m.begin();it!=m.end();it++)
{
cout<<it->second.size()<<endl;
if(it->second.size() > x)
cout<<"Hello World"<<endl;
}
}
.size()
is unsigned type andx
is signed. An operation between 2 different types carries an automatic type conversion. In your case the operation is comparison with the>
operator. C++ converts the signed type to unsigned. So-1
will be treated as a very big number.Thanks man.
Bekh is correct, it's about comparing different types and casting.
Advice for the future: compile with
-Wall
and always get rid of warnings.I have "#define SZ(x) (int)(x).size()" in my macros and it is not to make my typing faster, but to omit all the idiotic shit that can happen when not casting it to signed type.
std::cout << (-1 > 1u ? "-1" : "1u") << " is greater\n";
-1 is greater