代码是关于找到第一个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&)'”。
答案 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;
}
答案 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 ) );