我想知道使用*(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;
}
答案 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)