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

Napisz funkcje remove_if, usuwającą z vectora elementy mniejsze niż 3

Object Storage Arubacloud
0 głosów
213 wizyt
pytanie zadane 14 czerwca 2020 w C i C++ przez kupson3697 Użytkownik (610 p.)

Cześć wszystkim,

Mam za zadanie napisać program, o poniższej treści:

 

Mój kod na ten moment wygląda tak:

#include <iostream>
#include <vector>
#include <functional>

using namespace std;

std::vector<int>::iterator remove_if(std::vector<int>::iterator b, std::vector<int>::iterator e, std::function<int(int)> n){

    std::vector<int> v {};

    std::vector<int>::iterator vBegin = v.begin();
    std::vector<int>::iterator vEnd = v.end();

    int i = 0;

    while(b<e){
        v.push_back(*b);

        if(!n(*b)){
            v.push_back(*b);
        }

        i++;
        b++;
    }

    b = b - i;

    int index = 0;

    while(b<e){
        *b = v[index];
        index++;
        b++;
    }

    return b;

}

int main() {
    std::vector<int> vector {-7, 5, 2, 2, 11, 2, 3};
    auto result = remove_if(vector.begin(), vector.end(), [](int element) {return element < 3; });
    for (auto iterator = vector.cbegin(); iterator < result;) {
        std::cout << *iterator++ << " ";
    }

    std::cout << std::endl;

}

 

Mój pomysł jest taki, żeby stworzyć vector z elementów, które są większe od 3 i nadpisać tym vectorem vector docelowy. Problem w tym, że o ile pierwsza pętla działa prawidłowo, druga nie do końca spełnia swoje zadanie tj. nie nadpisuje vectora w main, moim vectorem z poprawnymi wartościami większymi od 3. Ktoś widzi może, gdzie zrobiłem błąd, lub ma pomysł, jak to inaczej ugryźć?

Będę bardzo wdzięczny za wskazówkiwink 

1 odpowiedź

+1 głos
odpowiedź 14 czerwca 2020 przez j23 Mędrzec (194,920 p.)
wybrane 15 czerwca 2020 przez kupson3697
 
Najlepsza

Pomocniczy wektor jest kompletnie niepotrzebny:

std::vector<int>::iterator remove_if(std::vector<int>::iterator b, std::vector<int>::iterator e, std::function<int(int)> n)
{
    auto src = b;
    while (src != e) {
        if(n(*b = *src)) ++b;
        ++src;
    }
    
    return b;
}

 

komentarz 15 czerwca 2020 przez kupson3697 Użytkownik (610 p.)

O kuurcze, dziękuję śliczne wink Jak czegoś nie rozumiem, to sobie rozpisuje i pojawia się dużo niepotrzebnych rzeczy.,a to można zrobić tak prosto.. Magialaugh 

komentarz 28 czerwca 2020 przez kupson3697 Użytkownik (610 p.)

@j23,

remove_if.cxx:3:12: error: ‘b’ was not declared in this scope
 auto src = b;
            ^
remove_if.cxx:4:5: error: expected unqualified-id before ‘while’
     while (src != e) {
     ^
remove_if.cxx:9:5: error: expected unqualified-id before ‘return’
     return b;
     ^
COMPILATION ERROR

 

Taki otrzymałem błąd. Nie mam pojęcia czemu nie przeszło, testowałem jeszcze i wszystko działa..

komentarz 28 czerwca 2020 przez j23 Mędrzec (194,920 p.)
Funkcja jest dokładnie taka, jaką pokazałem?
komentarz 28 czerwca 2020 przez kupson3697 Użytkownik (610 p.)

Tak.  Jedynie Twoja funkcja zwracała -7 2 2 2, a miała zwracać 5 11 3 w tym przypadku, więc zanegowałem:

if(!n(*b = *src)) ++b;

I wynik był poprawny dla każdych danych. Niestety sprawdzarka profesora zwróciła taki błąd.

komentarz 29 czerwca 2020 przez j23 Mędrzec (194,920 p.)

Jedynie Twoja funkcja zwracała -7 2 2 2,

Co? → link

komentarz 29 czerwca 2020 przez kupson3697 Użytkownik (610 p.)
Dobra, wysłałem tylko "++b" wziąłem w klamry i przeszło.. Jeszcze raz ślicznie dziękuję kolego ;-)

Podobne pytania

0 głosów
1 odpowiedź 156 wizyt
0 głosów
3 odpowiedzi 179 wizyt
pytanie zadane 24 października 2018 w C i C++ przez KmNwK Nowicjusz (210 p.)
0 głosów
1 odpowiedź 175 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 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!

...