C++ 检查是否有一个向量<;int>;可以嵌套在另一个

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()); } 如注释中所述,您使用的算法返回

我正在试用Edabit上的挑战,当前的挑战是关于嵌套向量。说明如下: 如果第一个数组可以嵌套在第二个数组中,则创建一个返回true的函数

如果满足以下条件,数组1可以嵌套在数组2内:

  • 阵列1的最小值>阵列2的最小值
  • 阵列1的最大值<阵列2的最大值
  • 示例:

    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; });
    }