[C++] Ce aleg intre ++i si i++?

Despre limbajul de programare C++ si biblioteca standard STL (forum moderat)
Post Reply
User avatar
Marius Bancila
Fondator
Fondator
Posts: 2343
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

[C++] Ce aleg intre ++i si i++?

Post by Marius Bancila » 30 Jul 2007, 23:15

Intrebare: Care din operatorii ++, prefix (++i) sau postfix (i++) ar trebui folosit?

Raspuns: Atunci cand este vorba de tipuri built-in (char, short, int, long) nu conteaza, dar in cazul tipurilor definite de utilizator este de preferat operatorul prefix, pentru ca evita crearea unui obiect temporar nenecesar. Motivul e ca operatorii ++ postfix mentin o copie temporara a obiectului initial, iar rezultatul e returnat prin valoare si nu prin referinta.

Code: Select all

class foo
{
public:
    foo& operator++()
    {
        //efectueaza operatia de incrementare
        return *this;
    }

    foo operator++(int)
    {
        foo temp = *this;
        //efectueaza operatia de incrementare
        return temp;
    }
};
Prin urmare, daca in cazul de mai jos nu conteaza tipul operatorului ++ folosit:

Code: Select all

for(int i = 0; i < 100; i++)
{
}

// sau

for(int i = 0; i < 100; ++i)
{
}
atunci cand se folosesc clase (cum ar fi iteratorii) e bine de folosit operatorul prefix:

Code: Select all

std::vector<int> vec;
for(std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
{
}

Next FAQ >>


Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

[C++] operatorul PREincrementare versus POSTincrementare

Post by Silviu Ardelean » 31 May 2010, 21:38

Multi programatori, in momentul in care doresc sa itereze prin containere STL, obisnuiesc sa foloseasca stilul clasic din C de postincrementare.

Code: Select all

for (std::list<std::string>::iterator it = myList.begin(); it != myList.end(); it++) 
{ 
   // ... codul tau 
}
unde std::list<std::string> myList;

Numai ca, folosirea operatorului postincrementare pe containere STL nu e recomandata. In schimb este recomandata utilizarea operatorului preincrement.

Operatorul postincrement aplicat pe iteratori trebuie sa se incrementeze pe el insusi si sa returneaza o copie o unui obiect temporar.

Code: Select all

_Myt_iter operator++(int)
{	// postincrement
  _Myt_iter _Tmp = *this;
  ++*this;
  return (_Tmp);
}
In schimb, operatorul preincrement este mai eficient pentru ca implementarea sa implicica doar returnarea unei referinte la acelasi iterator.

Code: Select all

_Myt_iter& operator++()
{	// preincrement
  ++(*(_Mybase_iter *)this);
  return (*this);
}
Codul initial se va schimba astfel:

Code: Select all

for (std::list<std::string>::iterator it = myList.begin(); it != myList.end(); ++it) 
{ 
   // ... codul tau 
}

Post Reply