Я не думаю, что вы полностью понимаете требование для этого алгоритма. (Кстати, это домашнее задание?)
Цель здесь - создать соответствие - список всех вхождений каждого слова. Смысл set
состоит в том, чтобы удерживать все вхождений. (Например: слово «яблоко» может появиться на страницах 1, 73 и 100. Поэтому запись на карте «яблоко» должна содержать все эти значения.)
Смысл нормализации состоит в том, чтобы сэкономить читателю время согласования: «яблоко», «яблоко» и «яблоки», вероятно, должны быть в одной записи на карте.
Понимая это, мы можем обновить вашу программу.
Во-первых, никогда не проверяйте eof
до того, как прочитаете данные. Это имеет смысл проверять только после прочтения данных. На самом деле, для этой проверки есть гораздо более простая идиома:
string word;
while (fin >> word) {
...
Мне кажется, что мы должны сохранить оригинальное слово в векторе, а затем использовать нормализованное слово в качестве индекса карты
text.push_back(word);
normalize(word);
Теперь обновление карты легко и просто. Вам не нужно pair
, просто используйте оператор []
. Поймите, что простая ссылка на запись карты приводит к ее появлению!
concordance[word].insert(text.size()-1);
РЕДАКТИРОВАТЬ Разбить последний бит на части:
concordance[word]
ищет запись, индексированную word
на карте. Если запись существует, она возвращается. Если запись не завершается, она создается, и вновь созданная запись возвращается. .insert
- операция вставки в набор, расположенный в записи карты, индексированной word
. text.size()-1
- это значение, вставленное в набор, расположенный в записи карты, индексированный как word
.
Собрав его обратно, concordance[word].insert(text.size()-1)
смотрит на карту, получает (или создает) указанный set
, а затем вставляет число text.size()-1
в этот набор.
Вот, пожалуйста!