Я пишу программу для класса 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 учебника не дают мне ответов, которые я ищу.