C++   ::   Хилл Мюррей

Страница: 76 из 357

Для краткости представления используется очень простая (и неэффективная) реализация:

const large = 1024; static pair vec[large+1*);

pair* find(char* p) /* поддерживает множество пар «pair»: ищет p, если находит, возвращает его «pair», иначе возвращает неиспользованную «pair» */ (* for (int i=0; vec[i].name; i++) if (strcmp(p,vec[i].name)==0) return amp;vec[i];

if (i == large) return amp;vec[large-1];

return amp;vec[i]; *)

Эту функцию может использовать функция value(), реализующая массив целых, индексированный символьными строками (вместо обычного способа):

int amp; value(char* p) (* pair* res = find(p); if (res-»name == 0) (* // до сих пор не встречалось: res-»name = new char[strlen(p)+1]; // инициализировать strcpy(res-»name,p); res-»val = 0; // начальное значение 0 *) return res-»val; *)

Для данной в качестве параметра строки value() находит целый объект (а не значение соответствующего целого); после чего она возвращает ссылку на него. Ее можно использовать,

например, так:

const MAX = 256; // больше самого большого слова

main() // подсчитывает число вхождений каждого слова во вводе (* char buf[MAX];

while (cin»»buf) value(buf)++;

for (int i=0; vec[i].name; i++) cout «„ vec[i].name «« ": " «« vec [i].val «« «\n“; *)

На каждом проходе цикл считывает одно слово из стандартной строки ввода cin в buf (см. Главу 8), а затем обновляет связанный с ней счетчик с помощью find(). И, наконец, печатается полученная таблица различных слов во введенном тексте, каждое с числом его встречаемости. Например, если вводится

aa bb bb aa aa bb aa aa

то программа выдаст:

aa: 5 bb: 3

Легко усовершенствовать это в плане собственного типа ассоциированного массива с помощью класса с перегруженной операцией (#6.7) выбора [].



2.3.

|< Пред. 74 75 76 77 78 След. >|

Java книги

Контакты: [email protected]