2010-04-05 14 views
5

Mam następujący kod do przypisania wartości do wszystkich elementów wektora:for_each ale do ustawiania każdego elementu na wartość w C++

x = 100; 

for (int i=0;i<vect.size();i++) 
{ 
    vect[i] = x; 
} 

To proste wystarczy, ale zastanawiam się, czy istnieje funkcja w STL, która robi to samo; coś jak dla_each, ale dla zadania.

+0

Osobiście zawsze wolałem 'BOOST_FOREACH', z którym można zrobić' BOOST_FOREACH (int & i, vect) {i = x; } ' –

Odpowiedz

10

Zastosowanie std::fill:

std::fill(vect.begin(), vect.end(), 100); 

Uwaga, jeśli chcesz zainicjować wektor mieć wszystkie te same wartości, można użyć odpowiedniego konstruktora:

std::vector<int> v(5, 100); // 5 elements set to 100 

assign mogą być wykorzystane "zresetować wektor", ale jeśli tylko tworzysz wektor, użyj konstruktora.

+1

Jeśli chcesz wypełnić istniejący wektor z mniejszą liczbą elementów niż ma to już miejsce i przyciąć resztę, aby zaoszczędzić miejsce, użyj idiomu zamiany:' vector (3,25) .swap (v); ' – wilhelmtell

+0

^^. .. idiom wymiany wywoła realokację, powinienem wspomnieć, ale spowoduje to mniej pamięci używanej do wektora. Ostatecznie jest to dobry pomysł tylko wtedy, gdy twoim zamiarem jest ograniczenie wykorzystania pamięci, a nie wypełnianie wektora (przypadkowo mniejszą liczbą) wartości. – wilhelmtell

7
vect.assign(n, x); 

n to liczba elementów.

x jest wartością do wypełnienia.

Różnica między wartością std::fill polega na podaniu odpowiedniej długości. std::fill użyłby poprzedniej długości wektora. (Właściwie użyłby on dowolnego segmentu wektora, który mu powiesz, ale użycie vect.begin() i jak w powyższym przykładzie użyłoby poprzedniej długości.) W zależności od sytuacji będziesz chciał użyć jednego lub drugiego.

+0

Inna różnica polega na tym, że 'assign()' jest członkiem 'wektora', podczas gdy' fill() 'jest częścią bardziej ogólnej biblioteki algorytmów, która działa z każdym forwardującym iteratorem (lub iteratorem wyjścia, jeśli używasz innego podpisu) . Myślę, że można rozsądnie oczekiwać, że 'vector :: assign()' będzie działał lepiej niż 'std :: fill()'. –

+0

@Michael: Prawdopodobnie. Powodem, dla którego wybrałem opcję "wypełnij", było dopasowanie kodu w pytaniu, chociaż prawdopodobnie można by to zrobić: vect.assign (vect.size(), x); '. Z drugiej strony, 'std :: fill' może specjalizować się w iteratorach z dostępem swobodnym, dając taki sam wynik pod względem wydajności. – GManNickG

+0

@Michael and GMan: Wątpię, że większość standardowych bibliotek optymalizuje na tyle, by mogła zmienić prędkość (chociaż 'assign' ma potencjał, aby być szybszym, ponieważ może potencjalnie używać SIMD, którego nie uważam za" wypełnienie " , chyba że kompilator jest naprawdę sprytny). Myślę, że chciałbyś uniknąć 'vect.assign (vect.size(), x)', ponieważ może on ponownie przydzielić tablicę wewnętrzną, w zależności od implementacji. Powodem, dla którego wybrałem 'assign' było to, że jest to funkcja, której używam więcej, wraz z konstruktorem, który jest bardzo podobny. 'fill' prawdopodobnie ma więcej sensu w tym przypadku. – Zifre

Powiązane problemy