проблема с использованием функции стирания для вектора в c ++ "No Matching Function" - PullRequest
0 голосов
/ 11 июня 2019

Код предназначен для нахождения суммы первых x простых чисел, и я использую алгоритм Sieve of Eratosthenes. Я не видел ни одного учебника по коду, я просто изучил концепцию и пытался реализовать ее самостоятельно. Мне нужно удалить элементы из вектора, для которых я могу использовать стирание. но вот где я сталкиваюсь с проблемой.

Я искал функцию для нахождения индекса определенного элемента в векторе, и это было из библиотеки алгоритмов. Похоже, это не сработало, поэтому я написал похожую функцию. Но возвращаемое значение, похоже, не работает с функцией стирания вектора.

// это из основной функции

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

// это функция find, которая возвращает индекс

// а здесь vi есть typedef 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;
}

поскольку функция поиска возвращает индекс, она должна работать в соответствии с этим и отправлять индекс, а функция стирания будет использовать этот индекс и удалять элемент из индекса. но это не похоже на работу. и я получаю "Нет подходящей функции для вызова ‘std :: vector :: erase (int &)’ ".

Ответы [ 2 ]

3 голосов
/ 11 июня 2019
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 голос
/ 11 июня 2019

Функция-член 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 ) );
...