Індексування h2>
Щоб визначити зміст індексів для об'єктів класу
використовується функція operator []. Другий параметр (індекс) функції operator []
може бути будь-якого типу. Це дозволяє визначати асоціативні масиви і т.п. У
Як приклад давайте перепишемо приклад, де при написанні невеликий
програми для підрахунку числа входжень слів у файлі застосовувався асоціативний
масив. Там використовувалася функція. Тут визначається належний тип
асоціативного масиву: p>
struct pair ( p>
char * name; p>
int val; p>
); p>
class assoc ( p>
pair * vec; p>
int max; p>
int free; p>
public: p>
assoc (int); p>
int &
operator [] (char *); p>
void
print_all (); p>
); p>
У assoc зберігається вектор пар
pair довжини max. Індекс першого невикористаного елемента вектора знаходиться
в free. Конструктор виглядає так: p>
assoc:: assoc (int s) p>
( p>
max =
(s <16)? s: 16; p>
free = 0; p>
vec = new pair [max]; p>
) p>
При реалізації застосовується все той же простий і
неефективний метод пошуку. Однак при переповнення assoc збільшується: p>
# include p>
int assoc:: operator [] (char * p) p>
/* p>
робота з
безліччю пар "pair": p>
пошук p, p>
повернення посилання на
цілу частину його "pair" p>
робить нову
"pair", якщо p не зустрічалося p>
*/ p>
( p>
register pair *
pp; p>
for
(pp = & vec [free-1]; vec <= pp; pp -) p>
if
(strcmp (p, pp-> name) == 0) return pp-> val; p>
if (free == max) (//переповнення: вектор збільшується p>
pair * nvec
= New pair [max * 2]; p>
for (int
i = 0; iname = new char [strlen (p) +1]; p>
strcpy (pp-> name, p); p>
pp-> val =
0;// початкове значення: 0 p>
return
pp-> val; p>
) p>
Оскільки подання assoc приховано, нам потрібен спосіб
його друку. У наступному розділі буде показано, як визначити відповідний
ітератор, а тут ми використовуємо просту функцію друку: p>
vouid assoc:: print_all () p>
( p>
for (int i = 0;
i> buf) vec [buf ]++; p>
vec.print_all (); p>
) p>
Список літератури h2>
Для підготовки даної роботи були використані матеріали
з сайту http://www.realcoding.net
p>