Algorytm zmiany indeksów każdej zmiennej w vectorze o 1

0

Dzień dobry,
chciałem się spytać o algorytm, który zmienia wszystkie indeksy vectora o jeden. Np. tablica to 1 2 3 4 5 6 7, ale chcemy usunąć wszystkie liczby które dzielą się przez 5, i tym samym skrócić tablice o jeden. Chciałem zrobić to tak.

liczba[i]=liczba[i+1];

ale w tej formie jedna liczba jest po prostu podwajana.

5

c++20 https://en.cppreference.com/w/cpp/container/vector/erase2

std::vector<int> vec{1, 2, 3, 4, 5, 6, 7};
std::erase_if(vec, [](auto x) {return x % 5 == 0;});

c++11:

std::vector<int> vec{1, 2, 3, 4, 5, 6, 7};
auto it = std::remove_if(vec.begin(), vec.end(), [](auto x) {return x % 5 == 0;});
vec.erase(it, vec.end());
0

@MarekR22: pisze że nie zadeklarowałem żadnego erase_if.

int zamiana(int x)
{
    erase_if(liczby, [](auto x) {return x % 5 == 0;});
}
0

@MarekR22: Nadal to samo

#include <iostream>
#include <numeric>
#include <string_view>
#include <vector>
#include <algorithm>

using namespace std;
vector <int> liczby (500001);
int zamiana(int x)
{
    erase_if(liczby, [](auto x) {return x % 5 == 0;});
}
0

@KomnatoMan:

To była dobra wiadomość.

Teraz zła.
Polegniesz na typowym szkolnym pytaniu o ten kod.

0

Może lepiej wytłumaczę o co mi chodzi, chce, zamienić liczby[i] na liczby[i+1], ale jak robie to w ten sposób liczby[i]=liczby[i+1] to teraz indeks i oraz i+1 mają te same wartośći, zależy mi na tym żeby ten błąd wyeliminować, i żeby problem rozwiązać w pętli wraz z zamianą indeksów.

1

Wyeliminowanie tego problemu usuwając kolejne elementy w pętli będzie szalenie nieefektywne i jest typowym przykładem problemu XY

Co rzeczywiście próbujesz zrobić - usunąć co piąty element (albo te, które dzielą się przez 5)

1
KomnatoMan napisał(a):

Może lepiej wytłumaczę o co mi chodzi, chce, zamienić liczby[i] na liczby[i+1], ale jak robie to w ten sposób liczby[i]=liczby[i+1] to teraz indeks i oraz i+1 mają te same wartośći, zależy mi na tym żeby ten błąd wyeliminować, i żeby problem rozwiązać w pętli wraz z zamianą indeksów.

Gramatycznie zamienić liczby[i] na liczby[i+1] oznacza, że tej drugiej "nie dzieje się żadna krzywda" - i ZŁA ANALIZA POCIĄGA ZŁY KOD.

Musisz wzbogacić sposób, w jaki analizujesz problem. Jak zaczniesz mówić o oczekiwanym działaniu ściśle, rozwiązanie się pojawi (niemal samo - przy posiadaniu podstaw z języka)

kq napisał(a):

Wyeliminowanie tego problemu usuwając kolejne elementy w pętli będzie szalenie nieefektywne i jest typowym przykładem problemu [XY][1]

Zgadzam się, ze to XY. Kolega w innych wątkach już bił n/t pianę.
To jest naprawianie złego włąsnego rozwiązania.

1

Pierwotne pytanie było dość jednoznaczne:

KomnatoMan napisał(a):

Dzień dobry,

chciałem się spytać o algorytm, który zmienia wszystkie indeksy vectora o jeden. Np. tablica to 1 2 3 4 5 6 7, ale chcemy usunąć wszystkie liczby które dzielą się przez 5, i tym samym skrócić tablice o jeden.

I takie rozwiązanie wskazałem.

0

@MarekR22: ale zorientowałem się że źle to opisałem

1

Na pewno źle? Jakie masz zadanie (nie "jak uznałeś, że trzeba zrobić")

0

@kq: thumbnail.png

0

Nie trzeba niczego usuwać z tablicy, wystarczy tablica typu bool w której za pomocą false zaznaczamy "usunięte" liczby.

0

@_13th_Dragon: tylko trzeba najpierw te liczby wyznaczyć

0

Indeksy tablicy są tymi liczbami.

0

ale jak mam ustawić tablice bool na false i jednocześnie wpisać do niej liczby?

0

Masz policzyć sito do końca i dopiero jak skończysz masz wypisać indeksy, dla których to sito wyłapało szczęśliwe liczby.

0

Takie coś mi z tego wyszło, oczywiście coś musiało mi nie wyjść. Miałem też problem z wymyśleniem jak porównywać z sitem tylko to co chciałem. Dlatego sort, ale teraz widze że nie będzie działać z sortem. Ale dalej, powinno coś i tak wypisać, a nic nie pisze.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int t[500001];
    int sito[500001];
    int j=1;
    int s=0;
    ios_base::sync_with_stdio(0);

    for(int i = 1;i<=1000000;i++){
        if(t[i]%2!=0){
            t[i]=j;
            j++;
        }
        else{continue;}
    }

    for(int i = 3;i<500001;){
        sito[s]=t[i];
        s++;
        i+=3;
    }

    for(int i = 7;i<166667;){
        sito[s]=t[i];
        s++;
        i+=7;
    }

    sort(sito,sito+500001);
    for(int i = 0;i<166667;i++){
        if(t[i]!=sito[i]){
            cout << t[i];
        }
        else{continue;}
    }
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1