Wpis z mikrobloga

#programowanie #cpp

Mirki, mam problem. Dam linka i powiem o co chodzi.

http://pastebin.com/Aim4PTyG

mmInt to typedef inta, mmReal to typedef double, nie chciałem już zmieniać tego, co wyjąłem z kodu.

Problemy są dwa:

1. Potrzebuję usunąć PIERWSZY element wektora, nie ostatni. Ma go wypieprzyć i wszystkie pozostałe przesunąć o jedną pozycję w górę. Jak to zrobić?

2. Nie ma sprawdzania zakresu macierzystej tablicy pikseli. W momencie, gdy przekazuję adres piksela, żeby mieć jak się do niego odnieść w tej wewnętrznej pętli kolorującej, to tracę informację, że to jest adres jakiegoś elementu tablicy i przez to jak sprawdzę sąsiedztwo, to może mi wywalić access violation jak złoto. Trzeba więc koniecznie dodać to sprawdzenie. Tutaj mam pewien pomysł, bo mogę wysupłać sobie wskaźnik elementu 0 jako odnośnik i odejmować go od danego adresu referencyjnego, który chcę sprawdzić. Jeśli wynik jest mniejszy od 0 to znaczy, że takiego elementu nie ma. Jeśli większy od element[0] + width*height - to samo.
  • 8
1. Potrzebuję usunąć PIERWSZY element wektora, nie ostatni. Ma go wypieprzyć i wszystkie pozostałe przesunąć o jedną pozycję w górę. Jak to zrobić?


@Khaine: jeśli możesz, to zrób swap pierwszego i ostatniego elementu; wywal ostatni. Jeżeli nie, to vector.erase(0) (złożoność O(n)).

2.

nie możesz trzymać tego jako vectora/std::array i przekazywać referencję na kontener, oraz iterator/referencję na konkretny piksel?
@kuhar:

mmReal* wynik = new mmReal[width*height]; czemu nie używasz tu std::vector, tylko z new się bawisz?


No bo wiem ile ta tablica ma elementów, nie muszę jej alokować dynamicznie. Zawsze będzie miała dokładnie tyle. Nawet jak nie będzie w niej nic.

nie możesz trzymać tego jako vectora/std::array i przekazywać referencję na kontener, oraz iterator/referencję na konkretny piksel?


Ciężko mi sobie wyobrazić, co tam się będzie działo w środku jak to zrobię.
No bo wiem ile ta tablica ma elementów, nie muszę jej alokować dynamicznie.


@Khaine: a new nie alokuje dynamicznie? Zachowanie będzię to samo, jeżali dasz vector nazwa(n);. Różnica taka, że masz wszystkie metody z vectora + masz automatyczne delete[].

Jeżeli liczba elementów jest znana podczas kompilacji, to może std::array?
@kuhar: Akurat w tym wypadku tak się przyzwyczaiłem, bo we wszystkich wcześniejszych etapach nie musiałem po prostu używać wektorów. Teraz kiedy muszę wypełniać obszary i nie mogę tego zrobić rekurencyjnie (z powodu stack overflow), to wektor jest mi potrzebny do pamiętania które elementy trzeba sprawdzić. Ogółem mam jeszcze niski level w obiektowości, więc podchodzę do tego trochę jak pies do jeża, jak nie widzę konieczności aby to stosować.

Wpadłem na taki
@kuhar: Podmieniłem w ogóle wektor na listę, bo lista może usuwać pierwszy element. Nie potrzebuję pozostałych funkcji wektora, bo tutaj wyciągam z wierzchu i wsadzam na koniec.
@Khaine: tylko się nie zdziw, jeżeli program znacznie zwolni. Sytacji, w których lista jest wydajniejsza od wektora jest naprawdę niewiele. Jeżeli chcesz usuwać elementy w początku, może lepiej pamiętać sobie oddzielnie taki wirtualny początek?