Dodawanie i usuwanie elementów tablicy poprzez pętlę

0

Cześć,
Mam pytanie odnośnie tablic w c++. Jeśli już mam jakąś tablicę z elementami [a1, a2,..., an] , a chciałbym w tej tablicy dodawać 0 lub więcej zer , pomiędzy elementami, żeby tak to wyglądało np. [a1,0,a2,0,...,0,an], to jak musiałbym poprawnie napisać pętlę.
Ten sam mam problem mam, jeśli musiałbym co któryś element usunąć z tablicy np. co drugi [a1,a3,a5,..,an]
Pozdrawiam
Marian

3

Z tablicami będzie problem, użyj std::vector (tutaj przydatne mogą być inne alternatywy, ale to zależy od dokładniejszej specyfikacji problemu). Najłatwiej będzie utworzyć nowyt wektor zamiast robić inserty w obecnym, bo to mało wydajne:

std::vector<int> a = {1,2,3,4,5};
std::vector<int> b;
b.reserve(a.size()*2);
for(int v : a) {
    b.push_back(v);
    b.push_back(0);
}

https://wandbox.org/permlink/X9Eia4iutB3J5AQS

Usuwanie może być prostsze, użyj std::remove_if

std::vector<int> a = {1,2,3,4,5};
bool keep = true;
auto it = std::remove_if(a.begin(), a.end(), [&](auto){ return keep = !keep; });
a.erase(it, a.end());

https://wandbox.org/permlink/XIhL5nGH0FJhblTA

0

Problem jest taki, że mam sobie bibliotekę libsndfile i chciałbym dzięki niej modyfikować częstotliwość pliku audio typu WAV. Wczytałem plik i uzyskałem informację o nim. Jednak chcąc zaimplementować algorytm zmiany potrzebuje wstawiać w zależności od częstotliwości 0 między próbki(elementy). Myślałem, że da radę to zrobić bazując na tablicy.

float *audio = new float[liczba_elementow]

No chyba, że idzie to zapisać w inny sposób, aby móc ją łatwiej modyfikować? Z góry przepraszam za zieloność w temacie.

Edit. W funkcji, której czytam ten plik audio, potrzebne jest użycie tablicy.

2

Jeśli używasz Bracie C++11 to std::vector ma metodę data() zwracającą wskaźnik do wewnętrznej tablicy - czyli miałbyś to, co chcesz. A co więcej, całą robotę związaną z rozszerzaniem tej tablicy, usuwaniem elementów itd to std::vector brałby na siebie, i miałbyś gwarancję iż wykona ją poprawnie skoro to klasa z biblioteki std.
Wyglądałoby to tak:

    std::vector<float> audio = { 1.0, 2.0, 3.0, 4.0, 5.0};
    for (auto it = audio.begin() + 1; it < audio.end(); it+=2)
    {
        it = audio.insert(it, 0.0);// wstawianie 0 przed każdym wewnętrznym elementem
    }
    float *audioTable = audio.data();//tu masz tablicę floatów, tak jakbyś zrobił float *audioTable = new float[size];
    //dowód
    for (int cnt = 0; cnt < audio.size(); cnt++)
    {
        std::cout << *(audioTable + cnt) << ", ";//wyrzuca 1, 0, 2, 0, 3, 0, 4, 0, 5
    }
0
std::vector<float> audio = { 1.0, 2.0, 3.0, 4.0, 5.0};

Tyle, że to co tutaj napisałeś jako przykładowe dane, to musi właśnie zwrócić mi ta biblioteka, która działa na tablicy :(

Zapis funkcji, która wczytuje te dane z biblioteki

sf_count_t  sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
1

Funkcja std::vector<T>::data() zwraca wskaźnik na tablicę T. Czyli mając std::vector<float> dostaniesz float*.
\

2

O Swarogu...toć co ci broni wywołać to tak:

std::vector<float> audio = { 1.0, 2.0, 3.0, 4.0, 5.0};
sf_count_t count =  sf_read_float (sndfile, audio.data(), audio.size());//nie wiem, co to jest sndfile

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