c ++“无匹配功能”中对向量使用擦除功能的问题

时间:2019-06-11 13:50:11

标签: c++ vector iterator erase

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

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

//这是来自主要功能

user

//这是from django.db.models.aggregates import Sum from django.contrib import admin from .models import MyModel @admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): list_display = ['user', 'visit_sum'] def get_queryset(self, request): queryset = super(MyModelAdmin, self).get_queryset(request) return queryset.values('user').annotate(visit_sum=Sum('visit_count')).order_by('-visit_sum') def visit_sum(self, obj): return obj.visit_sum 函数,它返回索引

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

vi

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

2 个答案:

答案 0 :(得分:3)

iterator erase (const_iterator position);

iterator erase (const_iterator first, const_iterator last);

没有擦除函数需要一个整数

由于这似乎不是一项家庭作业,因此编写自己的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

答案 1 :(得分:1)

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

所以这个电话

v.erase(f);

f是整数是无效的。

还有什么原因使用您自己的错误代码功能find而不是标准算法std::find

第一个代码段可以通过以下方式修改:

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