(Re) inicializovat vektor na určitou délku s počátečními hodnotami

hlasů
5

Jako funkce argumentu jsem si vector<double>& vec(výstupní vektor, tedy bez const) s neznámou délkou a hodnot. Chci inicializovat tento vektor ke specifické délky n se všemi nulami.

To bude fungovat

vec.clear();
vec.resize( n, 0.0 );

A to bude fungovat stejně dobře:

vec.resize( n );
vec.assign( n, 0.0 );

Je druhým efektivnější (protože se nejedná o paměť dealokace / alokace)? Existuje efektivnější způsob, jak to udělat?

Položena 06/10/2008 v 12:52
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
9

std::vector<double>(n).swap(vec);

Poté, vec je zaručeno, že velikosti a kapacity n, se všemi hodnotami 0,0.

Možná, že více idiomatická cesta od C ++ 11

vec.assign(n, 0.);
vec.shrink_to_fit();

se na druhém řádku volitelné. V případě, že veczačíná s více než nprvky, ať už pro volání shrink_to_fitje trade-off mezi držel více paměti, než je požadováno vs provedení přeřazení.

Odpovězeno 06/10/2008 v 15:43
zdroj uživatelem

hlasů
9
std::vector<double>(n).swap(vec);

To má tu výhodu, že ve skutečnosti zhutňování svou vektor taky. (Ve svém prvním příkladu, clear()nezaručuje kompaktní svá vektoru).

Odpovězeno 06/10/2008 v 12:53
zdroj uživatelem

hlasů
3

No pojďme kola ven způsoby, jak to udělat :)

vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
Odpovězeno 06/10/2008 v 22:22
zdroj uživatelem

hlasů
2

Ani jeden z fragmentů kódu, které jste zveřejnili dělat žádnou paměťovou deallocation, takže jsou zhruba stejné.

Swap trik, že všichni ostatní udržuje vysílání bude trvat déle provést, protože to bude navrátit paměť původně použitý vektorem. To může nebo nemusí být žádoucí.

Odpovězeno 07/10/2008 v 06:29
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more