Wpis z mikrobloga

@sylwke3100:

C++98
i

C++03
:

for_each(Obiekt.begin(),Obiekt.end(), F);
albo

for(map < int, map >::iterator it = Obiekt.begin(), end = Obiekt.end(); it != end; ++it) { ... }
(

const_iterator
jeśli tylko oglądasz)

C++11
:

to co wyƶej oraz

for(auto it = begin(Obiekt), e = end(Obiekt); it != e; ++it){ ... }
albo

for(auto&& element : Obiekt) { ... }
@KrzaQ2: Właściwie dlaczego praktycznie wszędzie widzę, że ludzie używając iteratorów robią ++it a nie it++? To tylko jakaś taka tradycyjna konwencja czy to ma jakieś uzasadnienie?
@Marmite: @kuhar:

Mając taki kod

map > ::const_iterator Object;

for (Object = OperationList.begin(); Object!=OperationList.end(); ++Object)

{

if (Object.size()==2 and RawData.substr(pos,Object[1].length())==Object[1])

{

addElement(Object[0],Object[1]);

pos+=Object[1].length()-1;

}

Wywala mi :

CristallParser.cpp|49|error: ‘std::map > >::const_iterator’ has no member named ‘size’|
Właściwie dlaczego praktycznie wszędzie widzę, że ludzie używając iteratorów robią ++it a nie it++? To tylko jakaś taka tradycyjna konwencja czy to ma jakieś uzasadnienie?


@Marmite: Nie tworzysz obiektu tymczasowego. Akurat Herb Sutter ostatnio o tym przyblogował. Ogółem, postinkrementacja inkrementuje obiekt i zwraca jego starą wartość, która naturalnie nie moƶe być samym obiektem. W przypadku STL-owych iteratorów praktycznie kaƶdy kompilator jest w stanie to zoptymalizować, ale nie ma sensu dla zasady
@sylwke3100:

dla

map >
map >::const_iterator it;
*it
to

pair< const int, map>&
it->first
to

const int&
it->second
to

map&
*begin(it->second)
to

pair&
begin(it->second)->first
to

const int&
begin(it->second)->second
to

string&