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

11 odcinek obiektowego c++

Object Storage Arubacloud
0 głosów
263 wizyt
pytanie zadane 5 maja 2015 w C i C++ przez Łukasz Świtaj Użytkownik (520 p.)
Pytanie kierowane do kursowiczów p. Mirka.
Pamiętacie moment, w którym rezerwujemy tablicę[1000]? Nie uważacie, że lepiej utworzyć vecotra? Dzięki temu oszczędzamy (co prawda nieznaczną ilość w porównaniu z całością programu) pamięć, a optymalizacja jest akurat ważnym aspektem.
Co Wy o tym sądzicie?

1 odpowiedź

0 głosów
odpowiedź 5 maja 2015 przez Radfler VIP (101,030 p.)
edycja 5 maja 2015 przez Radfler

Masz rację :) Jednak wektor przy powiększaniu musi sobie rezerwować dodatkową pamięć, kopiować zawartość do nowych obszarów itd. -> tracimy czas na kopiowanie. Nawet jeżeli w Twoim wektorze jest (powiedzmy) 1000 elementów, ten mógł zarezerwować pamięć na 1100 obiektów :) (chce wyprzedzić nasze oczekiwania)

http://en.cppreference.com/w/cpp/container/vector

vector<int> inty;
for(int i=0; i<1000; i++)
    inty.push_back(i);
inty.size(); // Tyle obiektów jest w wektorze
inty.capacity(); // A tyle pamięci wektor zarezerwował
inty.shrink_to_fit(); // Dopasowanie rozmiaru wektora do liczby elementów (C++11)

Lepiej użyć listy, lub innego szybszego kontenera

http://en.cppreference.com/w/cpp/container

Jednak przy takich ilościach jak 1000 elementów strata czasowa jest niezauważalna :)

komentarz 5 maja 2015 przez adrian17 Ekspert (345,160 p.)

Niekoniecznie:

vector<int> inty;
inty.resize(1000); // size == 1000, capacity == 1000
// lub:
vector<int> inty(1000); // size == 1000, capacity == 1000
// a potem:
for(int i = 0; i < 1000; ++i)
    inty[i] = i;

A co do "szybszych kontenerów" - w typowych zastosowaniach std::vector jest najszybszy, jedyne co może go pobić to std::array. std::list jest szczególnie złym pomysłem, polecam obejrzenie: https://www.youtube.com/watch?v=YQs6IC-vgmo

 

komentarz 5 maja 2015 przez Radfler VIP (101,030 p.)

W sumie masz rację. std::array jest najszybszy, bo jego rozmiar jest ustawiony 'na sztywno'. Ten przykład z listą był faktycznie słaby :L Ja tam najczęściej używam std::deque i std::vector oraz moich własnych. Jednak co do Twojego przykładu:

#include <iostream>
#include <vector>
using namespace std;

template<typename _Tp> // Funkcja wyświtlająca parametry vectora
inline void param(vector<_Tp> &v) {
    cout << "size() == " << v.size() << "\t\t"
            "capacity() == " << v.capacity() << endl;}

int main() {

    vector<int> inty(1000); // Rozmiar ustawiony 'na sztywno'
    param(inty);

    for(int i=0; i<500; i++)
        inty.push_back(i);
    param(inty); // size == 1500, capacity ~~ 2000

    inty.shrink_to_fit(); // Dopasowanie
    param(inty);

    inty.resize(100);
    param(inty);

    inty.reserve(3000);
    param(inty);
}

std::vector to kontener dynamiczny więc częściej używamy go, gdy nie znamy potrzebnego rozmiaru. Jeżeli z góry wiemy jaki będzie rozmiar to lepiej użyć std::array lub zwykłej tablicy.

Podobne pytania

0 głosów
2 odpowiedzi 166 wizyt
0 głosów
3 odpowiedzi 200 wizyt
pytanie zadane 21 listopada 2015 w C i C++ przez aspoka Mądrala (5,290 p.)
–1 głos
1 odpowiedź 207 wizyt
pytanie zadane 22 stycznia 2021 w Nasze poradniki przez Przemfort Nowicjusz (150 p.)

92,631 zapytań

141,496 odpowiedzi

319,868 komentarzy

62,011 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!

...