【问题标题】:problem using erase function for a vector in c++ "No Matching Function"在c ++“无匹配函数”中对向量使用擦除函数的问题
【发布时间】:2019-10-25 23:16:42
【问题描述】:

代码是关于找到第一个 x 素数的总和,我使用的是埃拉托色尼筛法。我还没有看到任何代码教程,我只是研究了这个概念并尝试自己实现。 我需要从向量中删除元素,我可以使用擦除。但这就是我面临的问题。

我搜索了一个函数来查找向量中特定元素的索引,它来自算法库。它似乎没有工作,所以我写了一个类似的函数。但是它的返回值似乎不适用于vector的擦除功能。

//这是来自主函数

int f=find(v,t2);
if(f!=-1)
    v.erase(f);
k++;
t2=t*k;

//这是返回索引的find函数

//这里vitypedef vector<int>

int find (vi v,int val)
{
    int first=0;
    while (v.size()!=first) {
        if (v.at(first)==val) return first;
        ++first;
    }
    return -1;
}

当 find 函数返回一个索引时,它应该根据该索引工作并发送一个索引,而擦除函数将使用该索引并从索引中删除元素。但它似乎没有工作。我得到 “没有匹配函数调用‘std::vector::erase(int&)’”。

【问题讨论】:

  • 如果您收到该函数不存在的错误,您应该check the reference 以确保您正确调用它。
  • 你确定find返回一个int吗?
  • 使用std::find() :) 如果你需要一个位置,你可以使用std::distance()
  • 一个int 不是一个std::vector::const_iterator(并且不能隐式转换为一个)。
  • 在 cmets 中,您抱怨答案对您不起作用。我建议您包含一个完整的代码示例(包含和使用命名空间指令/声明)。如果没有您的代码,基本上不可能理解您的具体示例中出了什么问题。

标签: c++ vector iterator erase


【解决方案1】:
iterator erase (const_iterator position);

iterator erase (const_iterator first, const_iterator last);

没有采用 int 的擦除函数

而且由于这似乎不是作业,因此编写自己的find() 毫无意义。使用这个:http://www.cplusplus.com/reference/algorithm/find/

这是一个如何工作的最小示例

#include <iostream>
#include <vector>
#include <algorithm>

void remove(std::vector<int> &vec, int number) {
    vec.erase(std::find(vec.begin(), vec.end(), number));
}

int main() {
  std::vector<int> vec;
  vec.push_back(11);
  vec.push_back(22);
  vec.push_back(33);

  remove(vec, 22);

  for (int i : vec) std::cout << i << std::endl;
}

Run it

【讨论】:

  • 正如我所写,算法库函数 find() 不起作用。我用 v.erase(find (v.begin(), v.end(), t2));它说“错误:没有匹配函数调用'find(std::vector::iterator, std::vector::iterator, int&)'”,我没有忘记包括头算法文件。
  • 如果这是一个引用,您忘记了命名空间,它的 std::find(...) 并且您忘记了标记容器结束的第二个迭代器
  • 我用命名空间std写过;一开始。如果我认为我是正确的 v.end() 标记容器的结束。但如果不是这种情况,那么就不了解第二个迭代器的事情。如果你能解释一下,那就太好了。
  • 我添加了一个我在在线编译器中验证的最小示例
【解决方案2】:

成员函数erase 接受一个或两个迭代器作为参数。

所以这个电话

v.erase(f);

其中f 是一个整数是无效的。

还有什么原因使用你自己的恶意函数find而不是标准算法std::find

第一个代码sn-p可以改写如下方式

auto it = std::find( std::begin( v ), std::end( v ), t2 );

if ( it != std::end( v ) ) v.erase( it );
//...

或者如果编译器支持 C++ 17 那么

if ( auto it = std::find( std::begin( v ), std::end( v ), t2 ); it != std::end( v ) )
{
    v.erase( it );
}
// ... 

如果您确实需要编写自己的函数find,那么它可以看起来像以下方式

using vi = std::vector<int>;

vi::size_type find( const vi &v, const int &val )
{
    vi::size_type i = 0;

    while ( i != v.size() && v[i] != val ) ++i;

    return i;
}

可以这样称呼

auto pos = find( v, t2 );

if ( pos != v.size() ) v.erase( std::next( std::begin( v ), pos ) );

【讨论】:

  • 但是 man find() 不起作用,这也是问题。否则我会使用它。现在我明白了我们不能传递整数进行擦除。任何其他方式> 使用 find() 表示“错误:没有匹配函数调用 'find(std::vector::iterator, std::vector::iterator, int&)'”跨度>
  • @captainShoo50 为什么 std::find 不工作?我已经展示了一个使用它的例子。你能重现它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多