Hoe wis ik een C++-array?

Hoe wis/leg ik een C++-array? Er is array::fill, maar het lijkt erop het is alleen C++ 11? Ik gebruik VC++ 2010. Hoe maak ik deze leeg (reset naar alle 0)?


Antwoord 1, autoriteit 100%

std::fill_n(array, elementCount, 0);

Ervan uitgaande dat arrayeen normale array is (bijv. int[])


Antwoord 2, autoriteit 30%

Uitgaande van een C-stijl array avan grootte N, met elementen van een type dat impliciet converteerbaar is van 0, stelt het volgende alle elementen naar waarden opgebouwd uit 0.

std::fill(a, a+N, 0);

Merk op dat dit niet hetzelfde is als “legen” of “opruimen”.

Bewerken: volgens de suggestie van James Kanze, zou je in C++11 het meer idiomatische alternatief kunnen gebruiken

std::fill( std::begin( a ), std::end( a ), 0 );

In afwezigheid van C++11 zou je je eigen oplossing als volgt kunnen uitrollen:

template <typename T, std::size_t N> T* end_(T(&arr)[N]) { return arr + N; }
template <typename T, std::size_t N> T* begin_(T(&arr)[N]) { return arr; }
std::fill( begin_( a ), end_( a ), 0 );

Antwoord 3, autoriteit 23%

std::fill(a.begin(),a.end(),0);

Antwoord 4

for (auto& a : SomeArray) a = 0;


Antwoord 5

Als je de array wilt vullen met iets anders dan intrinsiekewaarden, zal std::fillhet niet knippen; in plaats daarvan vond ik std::generatenuttig. bijv. Ik had een vector met lijsten die ik wilde initialiseren

std::generate(v.begin(), v.end(), [] () { return std::list<X>(); });

Je kunt ook ints doen, bijv.

std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });

of gewoon

std::generate(v.begin(), v.end(), [] (){ return 0; });

maar ik stel me voor dat std::fill sneller is in het eenvoudigste geval


Antwoord 6

Hé, ik denk dat de snelste manier om dat soort bewerkingen uit te voeren, is door het geheugen te memset() .

Voorbeeld-

memset(&myPage.pageArray[0][0], 0, sizeof(myPage.pageArray));

Een vergelijkbare C++-manier zou zijn om std::fill

. te gebruiken

char *begin = myPage.pageArray[0][0];
char *end = begin + sizeof(myPage.pageArray);
std::fill(begin, end, 0);

Antwoord 7

Als het maar 0 is, dan kun je memsetgebruiken:

int* a = new int[6];
memset(a, 0, 6*sizeof(int));

Other episodes