C++ 检查是否有一个向量<;int>;可以嵌套在另一个
我正在试用Edabit上的挑战,当前的挑战是关于嵌套向量。说明如下: 如果第一个数组可以嵌套在第二个数组中,则创建一个返回true的函数 如果满足以下条件,数组1可以嵌套在数组2内:C++ 检查是否有一个向量<;int>;可以嵌套在另一个,c++,arrays,vector,containers,c++17,C++,Arrays,Vector,Containers,C++17,我正在试用Edabit上的挑战,当前的挑战是关于嵌套向量。说明如下: 如果第一个数组可以嵌套在第二个数组中,则创建一个返回true的函数 如果满足以下条件,数组1可以嵌套在数组2内: 阵列1的最小值>阵列2的最小值 阵列1的最大值 *std::min_元素(arr2.begin(),arr2.end())和 *std::max_元素(arr1.begin(),arr1.end())< *std::max_元素(arr2.begin(),arr2.end()); } 如注释中所述,您使用的算法返回
canNest([1, 2, 3, 4], [0, 6]) ➞ true
canNest([3, 1], [4, 0]) ➞ true
canNest([9, 9, 8], [8, 9]) ➞ false
canNest([1, 2, 3, 4], [2, 3]) ➞ false
我编写的代码没有通过所有测试,如下所示:
bool canNest(std::vector<int> arr1, std::vector<int> arr2) {
return (std::min_element(arr1.begin(), arr1.end()) >
std::min_element(arr2.begin(), arr2.end()) &&
std::max_element(arr1.begin(), arr1.end()) <
std::max_element(arr2.begin(), arr2.end()));
}
编辑:可以找到挑战,用于测试解决方案 正如Dyukha在comments min/max_元素中所说,返回一个迭代器,您需要取消引用它们
bool canNest(std::vector<int> arr1, std::vector<int> arr2) {
return (*std::min_element(arr1.begin(), arr1.end()) >
*std::min_element(arr2.begin(), arr2.end()) &&
*std::max_element(arr1.begin(), arr1.end()) <
*std::max_element(arr2.begin(), arr2.end()));
}
bool canNest(标准::向量arr1,标准::向量arr2){
return(*std::min_元素(arr1.begin(),arr1.end())>
*std::min_元素(arr2.begin(),arr2.end())和
*std::max_元素(arr1.begin(),arr1.end())<
*std::max_元素(arr2.begin(),arr2.end());
}
如注释中所述,您使用的算法返回需要取消引用的迭代器。对于此任务,您可能应该查看它们的同伴,std::minmax_元素
,它将迭代器返回到min和max元素,而不必多次遍历列表:
bool canNest(const std::vector<int>& arr1, const std::vector<int>& arr2) {
auto [min1, max1] = std::minmax_element(arr1.begin(), arr1.end());
auto [min2, max2] = std::minmax_element(arr2.begin(), arr2.end());
return *min1 > *min2 && *max1 < *max2;
}
我记得,你必须用*:来到这样一个论坛,要求其他人帮助你解决缺少挑战精神的问题吗?min/max\u元素返回一个迭代器,遵守文档中的说明,他们返回迭代器,注意,使用
std::minmax_元素
可以做得更好一些。
bool canNest(const std::vector<int>& arr1, const std::vector<int>& arr2) {
auto [min1, max1] = std::minmax_element(arr1.begin(), arr1.end());
auto [min2, max2] = std::minmax_element(arr2.begin(), arr2.end());
return *min1 > *min2 && *max1 < *max2;
}
bool canNestImproved(const std::vector<int>& arr1, const std::vector<int>& arr2) {
auto [min2it, max2it] = std::minmax_element(arr2.begin(), arr2.end());
// all elements in arr1 must fall within the boundaries and std::all_of
// will stop iterating over arr1 as soon as the lambda returns false.
return std::all_of(
arr1.begin(), arr1.end(),
[min2 = *min2it, max2 = *max2it](int x) { return x > min2 && x < max2; });
}