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

Usuwanie elementu z tablicy

Object Storage Arubacloud
0 głosów
6,450 wizyt
pytanie zadane 13 kwietnia 2018 w C i C++ przez antek782 Początkujący (490 p.)

Witam,

Napisałem funkcję dodającą obiekt do obiektu Planeta. 

void planeta::dodaj_zwierze(zwierze zwierze_){
    ilosc_zwierzat++;
    zwierze* pom = new zwierze[ilosc_zwierzat];
    for (int i = 0; i<ilosc_zwierzat - 1; i++){
        pom[i] = zwierzeta_[i];
    }

    pom[ilosc_zwierzat-1] = zwierze_;

    if(zwierzeta_ != 0)
        delete[] zwierzeta_;

    zwierzeta_ = pom;
}

Niestety nie wiem jak sobie poradzić z funkcją, która będzie usuwała i-ty z tej tablicy.

 

komentarz 13 kwietnia 2018 przez j23 Mędrzec (194,920 p.)

A dlaczego nie std::vector, tylko robótki ręczne?

2 odpowiedzi

0 głosów
odpowiedź 13 kwietnia 2018 przez TenGumis Gaduła (3,440 p.)

Musisz napisać podobną pętlę. Jeśli indeks z pod którego chcesz usunąc to k (licząc od 0) to podczas przepisywania do nowej tablicy musisz napisać if'a który w momencie gdy trafi na k nie przepisze go i ponadto gdzies zapamieta że od tej pory powinien do i-tej komorki wpisywac i+1 ze starej tablicy (bo jeden element pomienlismy):

if(i == k) 
{
	przesun =1;
	continue;
}
pom[i] = zwierzeta_[i + przesun];


oczywiscie przesun musisz zainicjować na 0 przed pętlą

 

0 głosów
odpowiedź 13 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)

W swoim śmietniku znalazłem przykład który pasuje do Twojego pytania. To przysłowiowe jedzenie zupy widelcem. Da się ale w jakim celu? Stosuj std::vector bo podejście w przykładzie który widzisz jest "samogwałtem programistycznym" w dzisiejszych czasach.

Widmo Grębosza krąży.. :/

#include <iostream>
#include <cstddef>

struct Container {
    Container(): current_size(), data(NULL) {}
    void add_value(int value) {
        // Nowa tablica
        // FIXME: A co jak się nie powiedzie?
        int * new_table = new int[current_size + 1];
        // Przepisywanie starych wartości
        for(std::size_t i = 0; i < current_size; ++i) {
            new_table[i] = data[i];
        }
        // Nowa wartość na końcu
        new_table[current_size] = value;

        delete [] data;
        ++current_size;
        data = new_table;
    }
    void remove_value_from_left(int value) {
        // Z pustej tablicy nie ma sensu...
        if(!current_size) {
            return;
        }
        for(std::size_t i = 0; i < current_size; ++i) {
            if(data[i] == value) { // Znaleziono element...
                // FIXME: A co jak się nie powiedzie?
                int * new_table = new int[current_size - 1];
                // Przepisywanie wartości przed... 
                for(std::size_t j = 0; j < i; ++j) { 
                    new_table[j] = data[j];
                }
                // Przepisywanie wartości po
                for(std::size_t j = i; j < current_size; ++j) {
                    new_table[j - 1] = data[j];
                }
                // Przypisanie nowej tablicy i dekrementacja wielkości
                delete [] data;
                data = new_table;
                --current_size;
                // Znaleziono 1 element, przepisano więc wyskakuję z pętli.
                break;
            }
        }
    }
    std::size_t size() const {
        return current_size;
    }
    // Nie chciałem robić operator[] bo nie wiem czy znasz.. 
    const int * get_table() const {
        return data;
    }
    ~Container() {
        delete [] data;
    }
private:
    int *data;
    std::size_t current_size;
};

int main() {
    Container container;
    container.add_value(100);
    container.add_value(200);
    container.add_value(300);
    std::cout << "Size before remove: " << container.size() << '\n';
    container.remove_value_from_left(200);
    std::cout << "Size after remove: " << container.size() << '\n';
    std::cout << "Container values:\n";
    for(std::size_t i = 0; i < container.size(); ++i) {
        std::cout << container.get_table()[i] << ' ';
    }
    std::cout << '\n';
}

Zażaleń typu "co można poprawić" nie przyjmuję. Tu można poprawić wszystko nie stosując tablic.

Jeśli będziesz stosował std::vector, pamiętaj o idiomie: Erase-remove idiom

Podobne pytania

0 głosów
4 odpowiedzi 974 wizyt
pytanie zadane 28 października 2018 w JavaScript przez Mikołaj Użytkownik (780 p.)
0 głosów
2 odpowiedzi 641 wizyt
pytanie zadane 24 stycznia 2019 w PHP przez aleksander_szut Użytkownik (940 p.)
0 głosów
1 odpowiedź 432 wizyt
pytanie zadane 8 czerwca 2020 w C i C++ przez fortuna Początkujący (310 p.)

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!

...