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
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());
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.
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
}
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) ;
Funkcja std::vector<T>::data()
zwraca wskaźnik na tablicę T
. Czyli mając std::vector<float>
dostaniesz float*
.
\
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