Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

resize array

Ostatnio zmodyfikowano 2013-04-27 01:11
Autor Wiadomość
usmiech
Temat założony przez niniejszego użytkownika
resize array
» 2013-04-26 03:18:16
No dobrze, przyjelo sie, ze array /tablica/ ma ograniczona z gory wielkosc i dlatego vector ma zastosowanie /nie mowie o array w  C++11/ Moje pytanie... czy mozliwe jest napisanie w C++ programu, ktory to zmieni ? Czy wtedy array bedzie powiekszac swoj rozmiar ?
P-81179
DejaVu
» 2013-04-26 09:35:57
Hm...? napisz jeszcze raz swoje pytanie bo raczej trudno wywnioskować o co Ci chodzi. Tablica ma zawsze stały rozmiar. std::vector to struktura/kontener, która dynamicznie realokuje pamięć, aby zmienić rozmiar tablicy.
P-81180
crash
» 2013-04-26 15:35:01
W Delphi poszli po rozum do głowy i wmontowali w język tablice dynamiczne, w cpp trzeba samemu łopatą jechać po kodzie. Właśnie po to powstały kontenery żeby wyeliminować niedogodność stałego, raz przydzielonego rozmiaru. Kontenery vector<?>, list<?>, stack<?> mogą mieć zmienne rozmiary w trakcie działania programu, różnica między nimi a kontenerami jest po pierwsze taka, że elementy nie leżą bezpośrednio koło siebie w pamięci przez co jest wolniejszy do nich dostęp. No i kontenery to dodatkowa pamięć, której w komputrze nieskończenie wiele nie ma ;>
P-81188
pekfos
» 2013-04-26 15:48:29
Kontenery vector<?>, list<?>, stack<?>
Zapomniałeś o std::deque<>, a std::stack<> to nie kontener.

niedogodność stałego, raz przydzielonego rozmiaru.
To nie zawsze "niedogodność".
P-81189
akwes
» 2013-04-26 15:49:46
Yyy... @crash

Przecież std::vector to blok pamięci i jego iterator to najczęściej zwykły wskaźnik. Jedyna rzecz to, że dodanie elementu może spowodować unieważnienie starych iteratorów przez realokację. std::stack, to adaptor kontenera, czyli w ogóle niepotrzebnie wspomniany. W std::vector przy operatorze "[]" nie ma dodatkowego narzutu, ponieważ on nic nie sprawdza, jak ktoś chce bezpieczną metodę to korzysta z at(). Jeżeli ktoś potrzebuje zwykłą tablicę dynamiczną to ma taką możliwość dzięki operatorowi new. Jeżeli zależy mu na szybkim kopiowani to ma funkcje memcpy i inne jej pokroju. Zupełnie nie rozumiem tego hejtu.
P-81191
crash
» 2013-04-26 17:06:05
Yhm, za stack<?> sorka, nie wiedziałem, że to nie kontener. Co do vectora sam z niego często korzystam, nie mniej nie ma co się oszukiwać - tablica jest,  była i będzie najszybsza. Skąd wiadomo, że dodawane elementy są w pamięci koło siebie, wynika to z alokatora pamięci (np. alokator małych obiektów, Andrei Alexandrescu C++ Nowoczesne projektowanie)? Nie chce mi się wierzyć, że dodawane elementy co jakiś czas i w międzyczasie inne operacje na pamięci powiedzmy (malloc/new), nie zakłóciłyby tego porządku ;>

Nie chcę się kłócić tylko dowiedzieć, żadne hejty :)

Dla siebie napisałem małe programiszcze badające:
* czas tworzenia obiektów:
- tablicy statycznej, dynamicznej, vector.push_back() wersja1, v.push_back() wersja2;

* czas dostępu do powyższych, wszystko dla miliona elementów

C/C++
#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

class Test
{
    int x;
   
public:
   
    Test() { x = 0; }
   
    Test( int y )
        : x( y )
    { };
   
    int Get() { return x; }
};

//----------------

inline void Start( int & Timer )
{
    Timer = clock();
}


inline void Stop( int & Timer )
{
    Timer = clock() - Timer;
}



int main()
{
    int s[ 4 ], i; //miliceconds, tmp
   
    cout << "Czasy tworzenia:\n";
   
    //usual static array
    Start( s[ 0 ] );
    Test T[ 1000000 ];
    Stop( s[ 0 ] );
   
    //dynamic arr
    Start( s[ 1 ] );
    Test * TT = new Test[ 1000000 ];
    Stop( s[ 1 ] );
   
    //vector, creating at push_back
    Start( s[ 2 ] );
    vector < Test > vTest1;
   
    for( i = 0; i < 1000000; ++i ) vTest1.push_back( Test( i ) );
   
    Stop( s[ 2 ] );
   
    //vector, adding via push_back existing elements
    Start( s[ 3 ] );
    vector < Test > vTest2;
   
    for( i = 0; i < 1000000; ++i ) vTest2.push_back( T[ i ] );
   
    Stop( s[ 3 ] );
   
    //display
   
    for( i = 0; i < 4; ++i ) cout << s[ i ] << endl;
   
    cout << "\n\nCzasy dostepu:\n";
   
    /**************************************/
   
    int tmp;
   
    //usual
    Start( s[ 0 ] );
   
    for( i = 0; i < 1000000; ++i ) tmp = T[ i ].Get();
   
    Stop( s[ 0 ] );
   
    //dynamic
    Start( s[ 1 ] );
   
    for( i = 0; i < 1000000; ++i ) tmp = TT[ i ].Get();
   
    Stop( s[ 1 ] );
   
    //vector+iterator
    Start( s[ 2 ] );
   
    for
    (
    vector < Test >::iterator it = vTest1.begin();
    it != vTest1.end();
    it++
    )
    {
        Test Tmp = * it;
        tmp = Tmp.Get();
    }
   
    Stop( s[ 2 ] );
   
    //vec as array
    Start( s[ 3 ] );
   
    for( i = 0; i < 1000000; ++i ) tmp = vTest2[ i ].Get();
   
    Stop( s[ 3 ] );
   
    //disp
   
    for( i = 0; i < 4; ++i ) cout << s[ i ] << endl;
   
   
    delete[] TT;
   
    return 0;
}

Tablice statyczne wypadają najszybciej wg oczekiwań
P-81198
akwes
» 2013-04-26 17:14:30
Tak, szok, że tablice statycznej wypadają najszybciej...

Ehh... Tablice po to są takie ubogie aby były bardzo szybkie. Porównaj sobie std::vector do tych dynamicznych tablic Delphi z które tak zachwalasz. O ile w ogóle są czymś innym niż tablice dynamiczne z C++ (bo jeżeli nie są czymś więcej, to nie wiem skąd stwierdzenie, że w Delphi nie trzeba "łopatą jechać po kodzie").
P-81200
crash
» 2013-04-26 17:19:46
Nie denerwuj się :D Napisałem, że wg oczekiwań więc żaden szok. Magię tablic dynamicznych w Delphi wywnioskuj sam: http://4programmers.net/Delphi/Setlength
P-81201
« 1 » 2 3
  Strona 1 z 3 Następna strona