robaczek122 Temat założony przez niniejszego użytkownika |
modyfikacja vectora zainicjalizowanego poprzez uniform w nowej wersji pętli for » 2016-11-16 20:33:43 #include <iostream> #include <vector> using namespace std;
int main() { vector < int > v1 = { 1, 2, 3, 4 }; for( int & x: v1 ) x = - x; for( const int & x: v1 ) cout << x << ' '; cout << endl; vector < bool > v2 = { 1, 1, 0, 0 }; for( auto && x: v2 ) x = !x; for( const bool & x: v2 ) cout << x << ' '; cout << endl; vector < bool > v3 = { 1, 1, 0, 0 }; for( bool & x: v3 ) x = !x; for( const bool & x: v3 ) cout << x << ' '; cout << endl; return 0; }
Wszystkie vectory zainicjalizowane w ten sam sposób, ale modyfikować danych nie da się w ten sam sposób. Dlaczego? Pierwszy vector intów w pętli for musi być pojedynczy &. Dlaczego nie podwójny skoro mamy same rvalue w vektorze? A może nie mamy? Drugi vector booli - teoretycznie wszystko zgodnie z moimi przewidywaniami - wymagany jest podwójny ampresant. Trzeci vector booli - dlaczego nie działa dokładnie ten sam kod co dla 1 vectora? (nawet się nie kompiluje). |
|
Monika90 |
» 2016-11-16 21:43:41 Incjalizacja wektorów nie ma nic do rzeczy. Owszem 1, 2 i 3 to są r-wartości, ale to nie mówi nic o tym czy wartość wyrażenia *v1.begin() to r-wartość czy nie. A tak się składa, że wynik dereferencji iteratorów wektora jest l-wartością, z wyjątkiem vector<bool> gdzie jest to r-wartość. |
|
robaczek122 Temat założony przez niniejszego użytkownika |
» 2016-11-17 08:10:33 Więc dla vector<bool> Zarówno: vector < bool > v2 = { 1, 1, 0, 0 }; for( auto x: v2 ) x = false;
Jaki i: vector < bool > v2 = { 1, 1, 0, 0 }; for( auto && x: v2 ) x = false;
Zmienia wartość boola w wektorze. Ale co się kryje pod "auto", gdybyśmy chcieli to zapisać bez tego słowa? |
|
karambaHZP |
» 2016-11-17 08:22:02 |
|
robaczek122 Temat założony przez niniejszego użytkownika |
» 2016-11-17 08:48:51 Chyba nie bardzo, bo: #include <iostream> #include <vector> using namespace std;
int main() { vector < bool > v1 = { 1, 1, 0, 0 }; for( auto x: v1 ) { x = false; } for( const bool & x: v1 ) cout << x << ' '; cout << endl; vector < bool > v2 = { 1, 1, 0, 0 }; for( bool x: v2 ) { x = false; } for( const bool & x: v2 ) cout << x << ' '; cout << endl; return 0; }
Wektor v1 i v2 wygląda inaczej po zastąpieniu auto boolem. |
|
karambaHZP |
» 2016-11-17 09:40:46 W pierwszym może być podstawione bool && , bo kompilator z kontekstu wywnioskuje chęć modyfikacji elementów. Tak działa auto . Edit: zjadłem znaczek. |
|
robaczek122 Temat założony przez niniejszego użytkownika |
» 2016-11-17 10:26:19 vector < bool > v2 = { 1, 1, 0, 0 }; for( bool & x: v2 ) { x = false; } Tak? Bo to się nie kompiluje. |
|
Monika90 |
» 2016-11-17 12:02:48 Ale co się kryje pod "auto", gdybyśmy chcieli to zapisać bez tego słowa? |
Klasa symulująca referencję do bitu. |
|
« 1 » |