Używam następujące struct jako wkład do generate_n
algorytm STL za:funktor nie są przechowywane pomiędzy kolejnymi połączeniami do generate_n
struct GenerateNumber {
GenerateNumber() : i(0) {}
int operator() (void) {
return i++;
}
private:
int i;
};
Przykładem z kodem, który wykorzystuje ten funktor jest:
std::vector <int> v1 (3);
std::vector <int> v2 (3);
GenerateNumber generateNumber;
std::generate_n (v1.begin(), 3, generateNumber);
std::generate_n (v2.begin(), 3, generateNumber);
Jednak wynikiem jest, że zarówno v1
, jak i v2
zawierają {0,1,2}
, zamiast v2
, aby zawierać {3,4,5}
. Sprawdziłem z przerwą, że konstruktor GenerateNumber
jest wywoływany tylko raz (wiem, że nie ma sensu, aby konstruktor był wywoływany więcej niż jeden raz, ale mimo to to sprawdziłem).
Wiem, że mogę rozwiązać ten problem, sprawiając, że i
jest statyczny, ale nie rozumiem tego zachowania. Dlaczego wartość i
nie jest przechowywana między kolejnymi połączeniami?
You powinien wspomnieć, że 'std :: ref' to C++ 11 (chociaż jest to również wspomniane w TR1). –
Prawdopodobnie będę musiał trzymać się 'statycznego' rozwiązania, ponieważ potrzebuję mojego kodu do kompilacji zarówno w VS2010 (który implementuje C++ 11) i GCC 4.4 (który nie). Jednakże, tylko dla kompletności, kiedy używam twojej sugestii, pojawia się następujący błąd kompilacji: 'error C2679: binary '=': nie znaleziono operatora, który bierze prawy operand typu 'void' (lub nie ma akceptowalnej konwersji) \t C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ algorithm \t 1581' –
@LucDanton: Dzięki za notatkę. Czasami zapominam, że był czas przed C++ 11. – nosid