• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sito Eratostenesa - polecenie erase w funkcji vector - nie można skompilować.

Object Storage Arubacloud
0 głosów
426 wizyt
pytanie zadane 27 grudnia 2019 w C i C++ przez AlexSilesia Nowicjusz (240 p.)

Witam. Uczę się języka C++ z książki Pana Bjarne Stroustrup. Wykonałem już parędziesiąt zadań ale tego nie mogę przeskoczyć. Mam napisać program konsolowy znajdujący liczby pierwsze metodą sita Eratostenesa. Używam do tego funkcji vector. Aby wyeliminować pewne wartości w konkretnych komórkach chciałbym zastosować polecenie vector.erase(nazwa_komórki); , jednak kompilator cały czas podświetla mi kropkę miedzy vector a erase a informacja o błędzie jest dla mnie ciężka do odszyfrowania. Używam Microsoft Visual Studio bo taki kompilator zalecił autor książki. Poniżej wklejam kod. Może on zawierać jeszcze jakieś inne błędy bo nie mogłem go przetestować z powodu tego problemu. Pozdrawiam i proszę o wsparcie lub wskazówki.

 

#include<iostream>
#include<iomanip>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include <forward_list>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include <array>
#include <regex>
#include<random>
#include<stdexcept>



int main()
{
    using namespace std;
    system("chcp 1250");
    int k = 2;
    int l = 3;
    int m = 5;
    cout << "Witaj w sicie Erastotenesa\n";
    vector<int> pula;
    for (int i = 0; i < 100; i++) {

        pula.push_back(i);
    }
    for (int j = 0; j < 100; j++) {
        pula.erase(k);
        k += k;

       pula.erase(l);
        l += l;
       pula.erase(m);
        m += m;
    }
    for (int n = 0; n < 100; n++) {
        cout << pula[n] << "\n";

    }
}

Treść błędu :

Kod    Ważność    Opis    Projekt    Plik    Wiersz    Stan pominięcia
C2664    Błąd    „std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>> std::vector<_Ty,std::allocator<_Ty>>::erase(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>,std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>) noexcept(<expr>)”: nie można dokonać konwersji argumentu 1 z „int” do „std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”    ConsoleApplication10    C:\Users\AlexPraca\source\repos\ConsoleApplication10\ConsoleApplication10\ConsoleApplication10.cpp    35    
 

Kod    Ważność    Opis    Projekt    Plik    Wiersz    Stan pominięcia
E0304    Błąd (aktywny)    żadne wystąpienie elementu funkcja przeciążona "std::vector<_Ty, _Alloc>::erase [gdzie _Ty=int, _Alloc=std::allocator<int>]" nie jest zgodne z listą argumentów    ConsoleApplication10    C:\Users\AlexPraca\source\repos\ConsoleApplication10\ConsoleApplication10\ConsoleApplication10.cpp    42    
 

3 odpowiedzi

0 głosów
odpowiedź 27 grudnia 2019 przez adrian17 Ekspert (344,860 p.)
vector::erase() bierze jako argument iterator, nie wartość/indeks.

Natomiast... na pewno tak Ci kazał napisać sito? Bo sito się pisze zupełnie inaczej, z niego się w ogóle nie usuwa niczego. Raczej też książka w tym momencie nie zakłada, że znasz vector::erase().
komentarz 27 grudnia 2019 przez tkz Nałogowiec (42,000 p.)
std::vector<int> vec;

vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
//vec[1]
vec.erase(vec.begin() + 1);

To nie jest usuwanie po indexie? Mimo wszystko index i iterator są ze sobą powiązane. 

nie wartość/indeks.

Więc to w moim rozumienie jest błędne stwierdzenie. 

komentarz 27 grudnia 2019 przez adrian17 Ekspert (344,860 p.)
Przekazujesz iterator. To, że dla niektórych kontenerów możesz z indeksu zrobić iterator, to inna sprawa ;) Poza tym, nie byłem pewny czy autor miał na myśli "chcę usunąć wartość pod indeksem k" czy "chcę usunąć wartość k, bo nie jest liczbą pierwszą", więc nie chciałem sugerować rozwiązania zakładając którąś z opcji.
komentarz 27 grudnia 2019 przez tkz Nałogowiec (42,000 p.)

Nadal to stwierdzenie jest błędne...

vector::erase() bierze jako argument iterator, nie wartość/indeks.

myvector.begin()+5

Bo to jest zarówno iteratorem jak i indexem.

komentarz 27 grudnia 2019 przez NewEraOfPeace Gaduła (4,790 p.)
Index to wartość liczbowa wskazująca pozycję, coś abstrakcyjnego. Iterator to adres, to wskaźnik na konkretne dane.
komentarz 27 grudnia 2019 przez tkz Nałogowiec (42,000 p.)
    int tab[4]={1,2,3,4};
    std::cout<<tab[2]<<'\n';
    int *w = &tab[2];
    *w = 4;
    std::cout<<tab[2];

Index również jest adresem, tylko, że zdereferowanym. 

komentarz 27 grudnia 2019 przez NewEraOfPeace Gaduła (4,790 p.)
Zdereferowany adres daje wartość pod tym adresem.
0 głosów
odpowiedź 27 grudnia 2019 przez AlexSilesia Nowicjusz (240 p.)

Bardzo dziękuję za odpowiedź. Problem rozwiązany i kolejnej rzeczy się nauczyłem :). Co do pytania kolegi to polecenie w książce brzmi:

Napisz program znajdujący liczby pierwsze z zakresu od 1 do 100. Istnieje klasyczna metoda rozwiązania tego zadania zwana ,,sitem Eratostenesa". Jeśli jej nie znasz poszukaj informacji w internecie. Zastosuj tą metodę w swoim programie. 

O funkcji vector było wcześniej napisane. Polecenie ,,erase" znalazłem w internecie. Tak jak wspomniałem to są moje początki i uznałem że to zadanie tak rozwiążę , jednak za parę godzin może zmienię zdanie :)

komentarz 27 grudnia 2019 przez adrian17 Ekspert (344,860 p.)
Polecam rzucić okiem na definicję sita w wikipedii, mają fajne animacje i pseudokod, powinny rozjaśnić sprawę.
0 głosów
odpowiedź 29 grudnia 2019 przez AlexSilesia Nowicjusz (240 p.)

Witam ponownie. Byłem ostatnio troszkę zajęty i nie zaglądałem do tego tematu. Zadanie udało mi się rozwiązać w następujący sposób. Bardzo dziękuję za cenne wskazówki :)

 

// ConsoleApplication9.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
//

#include<iostream>
#include<iomanip>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include <forward_list>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include <array>
#include <regex>
#include<random>
#include<stdexcept>



int main()
{
    using namespace std;
    system("chcp 1250");
    int val = 2;
    int nextval = 2;
    cout << "Witaj w sicie Erastotenesa\n";
    vector<int> pula;
    while (nextval < sqrt(100)) {
        for (int i = 0; i < 100; i++) {

            pula.push_back(i);
        }
        for (int i = 0; i < 50; i++) {

            val += nextval;
            if (val < pula.size())
                pula[val] = 0;
        }
        for (int i = 0; i < 100; i++) {

            if (pula[i] > nextval) {
                nextval = pula[i];
                val = pula[i];
                break;
            }
        }
    }

         
        
        for (int i = 0; i < 100; i++) {
            if(pula[i] != 0)
                cout << pula[i] << "\n";
        }
      
    }

 

Podobne pytania

0 głosów
1 odpowiedź 533 wizyt
pytanie zadane 19 marca 2022 w C i C++ przez yachikson Nowicjusz (120 p.)
0 głosów
1 odpowiedź 286 wizyt
pytanie zadane 19 października 2016 w C i C++ przez MasterKiller Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 456 wizyt
pytanie zadane 6 stycznia 2018 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)

92,579 zapytań

141,427 odpowiedzi

319,653 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...