【问题标题】:No Matching function to call. C++ STL没有要调用的匹配函数。 C++ STL
【发布时间】:2021-06-19 20:26:45
【问题描述】:

我是 C++ STL 的新手。我正在编写一个函数来检查一个向量是否是另一个向量的子集(重复元素也算在内)并打印“是”或“否”。我想出了以下代码:

void checkMagazine(vector<string> magazine, vector<string> note) {
    vector<string>::iterator a;
    for(int i=0;i<note.size();i++)
    {
        a=find(magazine.begin(),magazine.end(),note[i]);
        if(a==magazine.end())
        {
            printf("No");
            return;
        }else magazine.erase(a-magazine.begin());
    }
    printf("Yes");
}

但是,我收到以下编译错误:

error: no matching function for call to ‘std::vector<std::__cxx11::basic_string<char>
>::erase(__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*,
std::vector<std::__cxx11::basic_string<char> > >::difference_type)’
         }else magazine.erase(a-magazine.begin());

我正在尝试使用擦除删除杂志中找到的元素。迭代器的声明类型有问题吗?为什么会这样? 此外,如果有其他方法/逻辑/内置函数可以使用 STL 完成所需的工作,请告诉我,因为我是新手并正在努力学习它。

【问题讨论】:

  • 您认为magazine.erase(a-magazine.begin()) 应该致电overloaded erase functions 中的哪一个?您认为a-magazine.begin() 的评估结果是什么?
  • 我认为擦除是一个内置的 STL 函数,可用于删除向量中的元素或元素范围。
  • 你是对的。但是您的论点没有指定“一个元素或元素范围”
  • a-magazine.begin() 会给出找到的元素的索引或位置...错了吗?
  • 不,没错。但是您是否看到任何接受索引的向量的erase 函数?如果您感到困惑,那么我建议您了解迭代器。迭代器和索引是两个不同的概念。

标签: c++ function vector stl


【解决方案1】:

erase 采用迭代器。你有那个迭代器,它叫做a。但是您随后将迭代器a 转换为相对于begin() 的偏移量。 erase 没有带偏移量的重载。

如果对向量进行排序,标准库有替代方案,但我们看不到调用代码,因此我们不能假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2016-11-23
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多