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 ? |
|
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. |
|
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 ;> |
|
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ść". |
|
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. |
|
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 #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; cout << "Czasy tworzenia:\n"; Start( s[ 0 ] ); Test T[ 1000000 ]; Stop( s[ 0 ] ); Start( s[ 1 ] ); Test * TT = new Test[ 1000000 ]; Stop( s[ 1 ] ); Start( s[ 2 ] ); vector < Test > vTest1; for( i = 0; i < 1000000; ++i ) vTest1.push_back( Test( i ) ); Stop( s[ 2 ] ); Start( s[ 3 ] ); vector < Test > vTest2; for( i = 0; i < 1000000; ++i ) vTest2.push_back( T[ i ] ); Stop( s[ 3 ] ); for( i = 0; i < 4; ++i ) cout << s[ i ] << endl; cout << "\n\nCzasy dostepu:\n"; int tmp; Start( s[ 0 ] ); for( i = 0; i < 1000000; ++i ) tmp = T[ i ].Get(); Stop( s[ 0 ] ); Start( s[ 1 ] ); for( i = 0; i < 1000000; ++i ) tmp = TT[ i ].Get(); Stop( s[ 1 ] ); Start( s[ 2 ] ); for ( vector < Test >::iterator it = vTest1.begin(); it != vTest1.end(); it++ ) { Test Tmp = * it; tmp = Tmp.Get(); } Stop( s[ 2 ] ); Start( s[ 3 ] ); for( i = 0; i < 1000000; ++i ) tmp = vTest2[ i ].Get(); Stop( s[ 3 ] ); for( i = 0; i < 4; ++i ) cout << s[ i ] << endl; delete[] TT; return 0; }
Tablice statyczne wypadają najszybciej wg oczekiwań |
|
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"). |
|
crash |
» 2013-04-26 17:19:46 |
|
« 1 » 2 3 |