pytanie o iteratory

0

hej! mam pytanie dotyczące iteratora

int funkcja_1 (vector<bool> *V1, vector<bool> *V2) 
{
	int suma=0;                                            
	vector<bool>::iterator Ix = (*V1).begin()+1;           
	vector<bool>::iterator Iy = (*V2).begin()+1;
	while (Ix != (*V1).end() && Iy != (*V2).end())          
	{
		if (*Ix == true && *Iy == true)                    
			++suma;
		++Ix;                                 
		
		++Iy;
	}
	return suma;                    
}

dlaczego po .begin() jest +1 ?? bardzo proszę o pomoc.

usunięcie pustych linii przed i po kodzie - fp

1

Ktoś najprawdopodobniej się pomylił, albo umyślnie pomija pierwsze elementy wektorów. Btw, nie powinno się używać wektorów booli, zamiast tego lepiej skorzystać z std::bitset.

0

dzięki! ale w każdym razie czy się pomylił czy nie, ta konstrukcja oznacza pominięcie pierwszego elementu tak?

4
satirev napisał(a):

Btw, nie powinno się używać wektorów booli, zamiast tego lepiej skorzystać z std::bitset.
vector<bool> jest dobrym rozwiązaniem w przypadku gdy programista potrzebuje pola bitowego o rozmiarze dynamicznym. Specjalizacja vector'a dla typu bool różni się od pozostałych. Jest ona co prawda zależna od implementacji jednak jest pisana optymalnie pod kątem pamięciowym. Niemniej stosując vector<bool> należy zdawać sobie sprawę, że w niektórych sytuacjach nie "zachowuje" się on tak jak pozostałe specjalizacje tego szablonu (np vector<bool>::iterator nie jest iteratorem swobodnego dostępu). Naturalnie w przypadku potrzeby użycia pól bitowych o rozmiarze statycznym bitset jest jak najbardziej odpowiedni.

0

Co wy macie do

->
strzałeczki?!
Po ludzku, z naprawionym błędem:

unsigned funkcja_1(vector<bool> *V1, vector<bool> *V2) 
{
        unsigned Result = 0;                                            
        vector<bool>::iterator Ix = V1->begin(),
                               Iy = V2->begin();
        while(Ix != V1->end() && Iy != V2->end())
            Result += *Ix++ & *Iy++;
        return Result;                    
}
1

Po co pointery, tam gdzie nie sa wskazane?

unsigned funkcja_1(const vector<bool>& V1, const vector<bool>& V2)
{
    unsigned Result = 0;                                            
    vector<bool>::const_iterator Ix, Iy;
    Ix = V1.begin();
    Iy = V2.begin();
    
    while(Ix != V1.end() && Iy != V2.end())
        Result += *Ix++ & *Iy++;
        
    return Result;                    
}
0

Można jeszcze prościej:

 
int foo(const std::vector<bool>& v1, const std::vector<bool>& v2)
{
    return std::inner_product(v1.begin(), v1.end(), v2.begin(), 0, std::plus<int>(), std::logical_and<int>());
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1