С++ для начинающих



     Мосит мау сит-сит Вселенная Стивена Amino. |     

Определение объекта map и заполнение его элементами - часть 3


separate_words() возвращает эти два вектора как объект типа pair, содержащий указатели на них. Сделаем эту пару аргументом функции build_word_map(), в результате которой будет получено соответствие между словами и позициями:

// typedef для удобства чтения

typedef pair< short,short >  location;

typedef vector< location >   loc;

typedef vector< string >     text;

typedef pair< text*,loc* >   text_loc;

extern map< string, loc* >*

    build_word_map( const text_loc *text_locations );

Сначала выделим память для пустого объекта map и получим из аргумента-пары указатели на векторы:

map<string,loc*> *word_map = new map< string, loc* >;

vector<string>   *text_words = text_locations->first;

vector<location> *text_locs  = text_locations->second;

Теперь нам надо синхронно обойти оба вектора, учитывая два случая:

  • слово встретилось впервые. Нужно поместить в map новую пару ключ/значение;
  • слово встречается повторно. Нам нужно обновить вектор позиций, добавив дополнительную пару (номер строки, номер колонки).
  • Вот текст функции:

    register int elem_cnt = text_words->size();

    for ( int ix=0; ix < elem_cnt; ++ix )

    {

        string textword = ( *text_words )[ ix ];

        // игнорируем слова короче трех букв

        // или присутствующие в списке стоп-слов

        if ( textword.size() < 3 ||

            exclusion_set.count( textword ))

               continue;

        // определяем, занесено ли слово в отображение

        // если count() возвращает 0 - нет: добавим его

        if ( ! word_map->count((*text_words)[-ix] ))

        {

            loc *ploc = new vector<location>;

            ploc->push_back( (*text_locs) [ix] );

            word_map->insert(value_type((*text_words)[ix],ploc));

        }

        else

        // добавим дополнительные координаты

        (*word_map)[(*text_words)[ix]]->

                           push_back((*text_locs)[ix]);

    }

    Синтаксически сложное выражение

    (*word_map)[(*text_words)[ix]]->




    Содержание  Назад  Вперед