|
Тема |
STL [re: Pesho] |
|
Автор |
Colombino (Компетент) |
|
Публикувано | 23.10.04 11:10 |
|
|
Прочети втория том от книгата на Строуструп и много неща ще ти се изяснят.
Нещата, разбира се се правят с rbegin(), rend() и reverse_iterator ( const_reverse_iterator ). Аз само ще ти обърна внимание на някои неща.
1. It++
Не трябва да се забравя, че итераторът не винаги е пойнтер. Постфиксната инкрементация е нещо, което би трябвало да се забрани със закон. Виж как изглежда в класа това нещо:
MyClass &operator++(void) // prefix
{
Inc();
return *this;
}
MyClass &operator++(int) // postfix
{
MyClass aCopy = *this;
Inc();
return aCopy;
}
2. array.end() - 1
Итераторите са в йерархия. Последователните итератори са по-базови от тези с произволен достъп. По принцип не е добре за последователен алгоритъм ( обхождане ) да ползваш операция с произволен достъп ( макар итераторът на std::vector да е с произволен достъп). Защо? Защото ако утре се окаже, че std::vector не е подходящ за целите ти и го замениш с std::list, това няма да се компилира. Не е болка за умиране, но се губи целта на обхождането с итератори - ами като си сигурен, че ще имаш произволен достъп, щото е std::vector не се мъчи с итератори, а си го обходи с operator[].
Идеята е да не налагаш изкуствени ограничения, които ще те приковат към контейнери поддържащи произволен достъп.
Същото се отнася и за отношенията iterator/const_iterator. В йерархията на класовете обикновено се правят като базов клас const_iterator и наследник iterator, добавяш функции за модификация. Ако няма да модифицираш ползвай по-базовия клас.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
|
| |
|
|
|