我想设计一种检查std :: set中数字序列的方法 例如,我有
set [1,3,4]
我可以看出该套装中缺少2号,
我能做的是在集合上做一个循环,并检查(current number - previous number) == 1
,如果是,循环将继续下一个到结束。如果没有,找不到号码。
但是对我的方法似乎不太好,所以我想知道是否有现有的std lib或boost可用于这种比较?
非常感谢!
答案 0 :(得分:3)
您可以用STL算法(C ++ 11)替换for循环:
auto it = begin(your_set);
while (it != end(your_set)) {
it = std::adjacent_find(it,
end(your_set),
[](int a, int b){ return (b - a) != 1; });
if (it != end(your_set)) {
std::cout << "Found gap at: " << *it << std::endl;
++it;
}
}
这将找到您设置中的所有空白。
Lambda函数,auto
关键字和独立的开始/结束是C ++ 11中的新功能。
答案 1 :(得分:-3)
你也可以通过递归来做到这一点。建议的解决方案是Java,但应该可以非常容易地移植到C ++。
public boolean isSequenceValid(int[] sequence) {
if (sequence.length == 0) return true;
return isNumberValid(sequence, 0, sequence[0]);
}
private boolean isNumberValid(int[] sequence, int index, int expectedValue) {
if (index >= sequence.length) return true;
if (sequence[index] != expectedValue) return false;
return isNumberValid(sequence, index+1, expectedValue+1);
}