вставка значений в карту вектора <entry> - PullRequest
1 голос
/ 27 февраля 2011

Я пишу программу для класса CIS Algorithm Analysis в школе, у меня возникли некоторые затруднения с пониманием реализации, касающейся того, как вставить данные, которые я проанализировал из входного файла, в карту, где значения являются вектором типа Запись, которая является структурой, содержащей номер страницы и диапазон. Я часами читаю и, похоже, не могу понять синтаксис правильно.

Первые 3 строки входного файла выглядят следующим образом:

IX: {Серия | (} {2} IX: {Серия! Геометрическая | (} {4} IX: {константа Эйлера} {4}

Обычно я анализирую индекс для книги, и когда я распечатываю карту, в ней должны быть перечислены заголовки и диапазоны страниц для всех заголовков / подзаголовков.

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <map>

using namespace std;

#define START 0
#define END -1

struct Cmp_Insen
{
bool operator()(const string &lhs, const string &rhs) const
    {
    return stricmp(lhs.c_str(), rhs.c_str()) < 0;
    }
};

struct Entry
{
int pageNum;
int type;
};

int main( int argc, char *argv[] )
{
string inputstring, ent_nam_substring, pag_num_substring, page_number;
int ent_nam_str, ent_nam_end, pag_num_str, pag_num_end;
vector<Entry> page_range;

if( argc < 2)
    return 0;
else
{
    ifstream the_file ( argv[1] );
    if( !the_file )
        cerr<<"Could not open file!\n";
    else
    {

    map<string,vector<Entry>,Cmp_Insen> mIndex;
    //map<string,vector<Entry>,Cmp_Insen>::const_iterator iter;
    //for(iter = mIndex.begin(); iter != mIndex.end(); ++iter)


    while( !the_file.eof() )
    {
        getline( the_file, inputstring );     // Extract Entry Heading Start
        ent_nam_str = inputstring.find("{");
        ent_nam_end = inputstring.find("}");
        ent_nam_substring = inputstring.substr(ent_nam_str + 1, ent_nam_end - (ent_nam_str + 1));          // Extract Entry Heading End


        pag_num_substring = inputstring.substr(ent_nam_end + 1, inputstring.length() - ent_nam_substring.length()); // Extract Page Number Start
        pag_num_str = pag_num_substring.find("{");
        pag_num_end = pag_num_substring.find("}");
        page_number = pag_num_substring.substr(pag_num_str + 1, pag_num_end - (pag_num_str + 1));  // Extract Page Number End


    }
    }
}
return 0;

}

Когда первая строка ввода заканчивается, обработка page_Number = '2'; и ent_nam_substring = "Series | ("

На карте «Серия» является ключом для этой строки, а «| (» обозначает начало диапазона страниц для этого заголовка, который начинается на странице 2. Что мне нужно сделать, это отсканировать каждую строку ввода и вставить ключ, если он не существует, и если он действительно существует, затем нажмите следующий номер страницы на вектор, связанный с этой клавишей, пока не будет достигнут "|)", обозначающий конец диапазона страниц для этого заголовка.

Мой другой связанный с этим вопрос заключается в том, что если я выполняю сравнение без учета регистра, чтобы карта оставалась упорядоченной по моим ключам, то должен ли я каждый раз вызывать сравнение с явной полнотой или после того, как оно будет определено и объявлено в объявлении карты, карта просто использует его всякий раз, когда выполняется такая операция как вставка?

Извините за путаницу, которую я вызываю из-за недостатка знаний, любая полезная обратная связь будет принята с благодарностью, так как мои 2 учебника не дают мне ответов, которые я ищу.

1 Ответ

0 голосов
/ 27 февраля 2011

Как только вы определили оператор сравнения, карта автоматически обрабатывает его использование.Вам не нужно это называть.

Кстати, Stricmp не переносим.В Unux вам может понадобиться strcasecmp.Это должно сработать:

#ifndef WIN32 
  #define stricmp strcasecmp 
#endif

Что касается остальной части вашего вопроса, вы объяснили, что должен делать ваш код, но вы забыли упомянуть, что он делает вместо этого ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...