避免 std::upper_bound 崩溃
Avoid crash from std::upper_bound
每当我这样做时:
auto itr = ranges::upper_bound(vector, value);
如果 value
大于 vector
中的任何值,那么它会给我一个 error/crash (debug assertion failed)
。我想以某种方式避免这种情况。我可能想到的唯一解决方案是:
ranges::sort(vector); // or any code which can find the maximum element in a container
if (*(vector.end()-1) > value)
auto itr = ranges::upper_bound(vector, value);
但是找到最大值意味着更多的工作,我可以用更有效的方式来做吗?
编辑:
我在崩溃时使用的全部代码在这里:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
auto main() -> int
{
int n, value;
cin >> n;
vector <int> vector;
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
vector.push_back(a);
}
cin >> value;
ranges::sort(vector);
auto itr = ranges::upper_bound(vector, value);
cout << *itr;
return 0;
}
来自cppreference:
Returns an iterator pointing to the first element in the range [first,
last) that is greater than value, or last if no such element is found.
这意味着它可能return结束迭代器。在这种情况下,您不能取消引用它。
每当我这样做时:
auto itr = ranges::upper_bound(vector, value);
如果 value
大于 vector
中的任何值,那么它会给我一个 error/crash (debug assertion failed)
。我想以某种方式避免这种情况。我可能想到的唯一解决方案是:
ranges::sort(vector); // or any code which can find the maximum element in a container
if (*(vector.end()-1) > value)
auto itr = ranges::upper_bound(vector, value);
但是找到最大值意味着更多的工作,我可以用更有效的方式来做吗? 编辑: 我在崩溃时使用的全部代码在这里:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
auto main() -> int
{
int n, value;
cin >> n;
vector <int> vector;
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
vector.push_back(a);
}
cin >> value;
ranges::sort(vector);
auto itr = ranges::upper_bound(vector, value);
cout << *itr;
return 0;
}
来自cppreference:
Returns an iterator pointing to the first element in the range [first, last) that is greater than value, or last if no such element is found.
这意味着它可能return结束迭代器。在这种情况下,您不能取消引用它。