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

Vector przechowujący kilka typów danych

Object Storage Arubacloud
0 głosów
756 wizyt
pytanie zadane 30 sierpnia 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
Cześć. Czy jest możliwość aby vector przechowywał więcej niż 1 typ danych? Chodzi mi o to żeby mógł przechowywać np: int, i moją klasę.
2
komentarz 30 sierpnia 2016 przez draghan VIP (106,230 p.)
Może i głupie pytanie, ale dlaczego chcesz przechowywać różne typy w jednym pojemniku? Przypuszczam, że powinieneś w tym miejscu użyć dziedziczenia, ale bez poznania Twoich pobudek to tylko domysły.
komentarz 30 sierpnia 2016 przez Avernis Nałogowiec (27,400 p.)
Mam kilka rodzai umiejętności w grze i wolałbym mieć je wszystkie w 1 vectorze po urzyciu zamiast się bawić w kilka
1
komentarz 31 sierpnia 2016 przez draghan VIP (106,230 p.)
To jest książkowy przykład wykorzystania polimorfizmu. ;)

4 odpowiedzi

+2 głosów
odpowiedź 30 sierpnia 2016 przez unknown Nałogowiec (39,560 p.)
Użyj boost::any( http://www.boost.org/doc/libs/1_55_0/doc/html/any.html ), chyba, że twój kompilator wspiera już w jakimś stopniu C++17 to użyj any z biblioteki standardowej: http://en.cppreference.com/w/cpp/utility/any
+1 głos
odpowiedź 30 sierpnia 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
A nie możesz użyć dwóch vectorów? :)

Ewentualnie jednego vectora, przechowującego strukturę, do której należą różne typy.
komentarz 30 sierpnia 2016 przez criss Mędrzec (172,590 p.)
Ale wtedy jestes zmuszony do sprawdzania typu jakimis typeid. Pointery sobie potrzymasz, ale w zasadzie niewiele z tego wynika. Skorzystaj z rozwiązań rzuconych przez smh albo unknown. Wydaje mi się, że to podane przez smh jest wydajniejsze, ale nie bierz tego serio bo nigdy nie używałem ani boost:any ani boost::variant nie mówiąc już o cpp17.
komentarz 30 sierpnia 2016 przez smh Obywatel (1,940 p.)

Ale wtedy jestes zmuszony do sprawdzania typu jakimis typeid.

Pomijając, że typeid jest raczej be, na void* to nie zadziała.

komentarz 30 sierpnia 2016 przez criss Mędrzec (172,590 p.)
edycja 30 sierpnia 2016 przez criss

Dlaczego? 

if (typeid(*vec[x]) == typeid(Type))

edit: nie, faktycznie, nie działa. Możesz wytłumaczyć?

komentarz 30 sierpnia 2016 przez smh Obywatel (1,940 p.)

if (typeid(*vec[x]) == typeid(Type))

Na wskaźniki typu void* operatora gwiazdki nie używamy. void* neutralnie wskazuje na… coś w pamięci, o nieokreślonym typie. Jaki typ miałoby mieć *vec[x] ?


Do stosowania vector<void*> dochodzi mnóstwo innych problemów:
• musimy dbać o przechowywanie informacji o typie, później konwertować wskaźniki u siebie w kodzie
• albo czasem życia zmiennych zaopiekujemy się gdzieś indziej, albo (…*stęk*) sami będziemy tym zarządzać, przy okazji wykonując parę castów.
• w obu przypadkach, vector (który sam jest już dynamiczny, tyle starczy!) przechowa tylko wskaźniki, do dalej dynamicznie alokowanej pamięci (zaś variant faktycznie przechowuje twoje zmienne, nie tylko wskaźniki do nich).

komentarz 31 sierpnia 2016 przez criss Mędrzec (172,590 p.)
Bleh, szczerze nie wiem w jaki sposób myślałem te 4h temu.. Dzięki anyway
+1 głos
odpowiedź 30 sierpnia 2016 przez smh Obywatel (1,940 p.)
edycja 30 sierpnia 2016 przez smh

Użyj std::variant<int, TwojaKlasa>. Przewagi nad std::any:
na twoje zmienne variant przeznaczy stos, nie stertę sam variant będzie na stercie (heap) dzięki/przez vector, ale i tak sam nie będzie dalej niczego alokował, więc powinno być nieco wydajniejsze
• variant nie przechowa typu innego, niż podane przez ciebie, w przeciwieństwie do any, które akceptuje jakikolwiek typ, jak nazwa wskazuje.

Oczywiście, jeśli nie ma tego jeszcze u ciebie w std::, możesz użyć odpowiednika z boost::.

0 głosów
odpowiedź 30 sierpnia 2016 przez Ehlert Ekspert (212,670 p.)
Możesz zrobić 2 klasy które będą dziedziczyć x jednej. Jednak jakoś w c++ nie widzi mi się takich rozwiązań. Po co. Pamiętaj proszę o SOLID zanim coś napiszesz.

Podobne pytania

0 głosów
1 odpowiedź 808 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
1 odpowiedź 1,055 wizyt
pytanie zadane 3 września 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 1,218 wizyt
pytanie zadane 16 czerwca 2017 w C i C++ przez excavelty Bywalec (2,480 p.)

92,566 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 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!

...