【问题标题】:no match for ‘operator+’ (operand types are ‘std::vector’ and ‘std::vector::size_type {aka long unsigned int}’)'operator+' 不匹配(操作数类型为'std::vector' 和'std::vector::size_type {aka long unsigned int}')
【发布时间】:2021-07-09 13:47:13
【问题描述】:

我找不到应用 size( ) 函数的方法。

我有以下输出:

main.cpp:13:23: error: no match for ‘operator+’ (operand types are ‘std::vector’ and ‘std::vector::size_type {aka long unsigned int}’)
         sort(arr, arr + arr.size());

在以下代码中:

vector<int> removeDuplicates2(vector<int> arr)
{
    if(arr.size() == 0) 
    {
        return {};
    } else 
    {
       sort(arr, arr + arr.size());
    }
    vector<int> noDuplicatesArr; 
    noDuplicatesArr.push_back(arr[0]);
    for(int i = 1; i < arr.size(); i++)
    {
        if(arr[i] != arr[i-1])
        noDuplicatesArr.push_back(arr[i]);
    }
return noDuplicatesArr;
}

所有代码都来自 geeksforgeeks.org 和 edcuba.com 文档,所以我不知道接下来在哪里可以找到解决方案; 我试图设置一个新值 n

vector<int> n = sizeof(arr) / sizeof(arr[0]);
OR
<int> n = sizeof(arr) / sizeof(arr[0]); 

我明白了

main.cpp:6:33: error: conversion from ‘long unsigned int’ to non-scalar type ‘std::vector’ requested
     vector<int> n = sizeof(arr) / sizeof(arr[0]);
OR
main.cpp:13:23: error: no match for ‘operator+’ (operand types are ‘std::vector’ and ‘int’)
         sort(arr, arr + n);

【问题讨论】:

  • 您希望这能做什么? arr + arr.size()
  • 您正在尝试将 C 样式的数组约定应用于 C++ std::vector。这是行不通的。我们可以纠正每个错误,但我建议您获取a good C++ book 以学习。 Geeksforgeeks 是出了名的糟糕来源。
  • 你的意思很可能是sort(arr.begin(), arr.end());,下面的代码是std::unique_copy的重新实现
  • @IgorTandetnik 这行得通。我已经知道了。但我正在关注 geeksforgeeks 的一些教程,但我只是卡住了
  • @NathanPierson 它也有助于保持一致。它对容器和 c-arrays 的工作方式相同。如果用作蓝图的代码 OP 使用了 std::beginstd::end,他们可以用摩擦更少的向量替换 c 数组

标签: c++ vector c++17


【解决方案1】:

sort 将一对迭代器作为其参数。

如果 arr 顾名思义是一个 C 风格的数组,那么在数组到指针衰减 arrarr + N(其中 N 是数组中的元素数)之后是指向数组开头和结尾的指针。指针是一个迭代器,因此这将是传递给sort 的有效参数对。

但是,arr 不是 C 样式的数组,它是 std::vector&lt;int&gt;。所以arr 不是迭代器,arr + arr.size() 正在尝试向容器添加大小,而这没有任何意义。值得庆幸的是,std::vector 确实为其迭代器提供了成员函数:beginend。所以你可以写

std::sort(arr.begin(), arr.end());

【讨论】:

    【解决方案2】:

    在某些情况下,使用 std::set 进行重复数据删除可能会更快。这将减少移动的数据,因为重复项永远不会插入到临时数据结构中。然后,removeDuplicates2 应该获得一个 const 引用以消除整个数组的不必要副本。理想情况下,您可以返回构造集而不是新向量。如果 removeDuplicates2 必须处理不同的数据类型,则应将其转换为模板。

    生成的函数非常简单:

    template <typename T>
    std::vector<T> removeDuplicates2(const std::vector<T>& arr)
    {
        if(arr.size() == 0) 
        {
            return {};
        }
    
        // Use a set to remove the duplicates
        std::set<int> set(arr.begin(), arr.end());
    
        // Copy result back to different container
        std::vector<int> result(set.begin(), set.end());
    
        return result;
    }
    

    我们甚至可以通过传递迭代器来抽象出一个向量。如果事实证明基于集合的方法会因分配策略而变慢,请尝试自定义分配器:Alternative for std::set without memory reallocation?

    【讨论】:

    • 最终更快取决于要排序的数据中有多少重复项。与往常一样,用户应使用自己的数据对多个解决方案进行基准测试。
    • 我写道,集合“应该比向量更快”,因为集合不需要跟踪重复项。如果事实证明在实践中基于向量的方法比基于集合的方法更快,因为向量具有更智能的分配策略,那么将集合与自定义分配器一起使用可能会有所帮助,如下所述:stackoverflow.com/questions/24096466/…
    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2020-07-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多