Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

modyfikacja vectora zainicjalizowanego poprzez uniform w nowej wersji pętli for

Ostatnio zmodyfikowano 2016-11-17 12:02
Autor Wiadomość
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
C/C++
#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).

P-153795
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ść.
P-153802
robaczek122
Temat założony przez niniejszego użytkownika
» 2016-11-17 08:10:33
Więc dla vector<bool>

Zarówno:
C/C++
vector < bool > v2 = { 1, 1, 0, 0 };
for( auto x: v2 )
     x = false;


Jaki i:
C/C++
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?
P-153817
karambaHZP
» 2016-11-17 08:22:02
bool
?
P-153819
robaczek122
Temat założony przez niniejszego użytkownika
» 2016-11-17 08:48:51
Chyba nie bardzo, bo:

C/C++
#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.
P-153820
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.
P-153824
robaczek122
Temat założony przez niniejszego użytkownika
» 2016-11-17 10:26:19
C/C++
vector < bool > v2 = { 1, 1, 0, 0 };
for( bool & x: v2 )
{
    x = false;
}

Tak? Bo to się nie kompiluje.
P-153829
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.
P-153831
« 1 »
  Strona 1 z 1