Я пытаюсь построить относительно сложную структуру данных (для меня). Моя цель — читать слова из текстовых документов и индексировать слова и некоторые специфические свойства в хэш-таблицу. Таблица строится из вектора векторов структур: (вектор ‹ вектор > vecName;). С этим мне повезло. Каждое уникальное слово хэшируется в позицию индекса в векторе. Второе измерение вектора (вектор структур) хранит информацию о читаемом файле и о том, где в файле находится слово. Для каждого файла, который я читаю, если я нахожу определенное слово несколько раз, счетчик увеличивается в структуре, а вектор структур с целыми числами сохраняет информацию для всех местоположений, в которых слово хранится в файле.
У меня есть два вопроса, с которыми я хотел бы получить помощь:
- Мне любопытно, есть ли у кого-нибудь предложения по лучшей реализации структуры данных, чем мое предложение. Будет ли класс, который содержит несколько независимых элементов данных вместо этого бегемота, более удобным для использования?
- Похоже, у меня либо синтаксическая ошибка, вызывающая ошибку компиляции, либо я просто пытаюсь создать структуру, которую векторный класс не поддерживает.
Вот ошибки компиляции. Все три ошибки относятся к вектору структур внутри структуры:
'class std::vector >' не имеет элемента с именем 'theLoc'
'класс std::vector >' не имеет элемента с именем 'theStart'
'класс std::vector >' не имеет элемента под названием "Конец"
Если я изменю код, как предлагает EboMike, исходные ошибки исчезнут, но я тогда получу:
Я получаю другую ошибку, которую я не могу опубликовать, потому что редактор думает, что я публикую гиперссылки. Резюме: * 'Запрос члена 'push_back' в 'testProps.wordProps::theWordLoc:theLoc, который имеет неклассовый тип 'int'*
Вот мой код и ссылка на диаграмму (из моего блога) того, как я вижу структуру данных:
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
using namespace std;
struct wordLoc
{
int theLoc; // the location of the word in theFile
int theStart; // the beginning of the sentence
int theEnd; // the end of the sentence
};
struct wordProps // stores word info to be placed in array
{
string theFile; // stores the file where theWord is found
int theCount; // increments with each occurence of theWord
vector <wordLoc> theWordLoc; // stores the wordLoc info for each occurence of theWord
};
int main()
{
int Tsize = 20000;
wordProps testProps;
testProps.theFile = "test1";
testProps.theCount = 1;
testProps.theWordLoc.theLoc.push_back(200);
testProps.theWordLoc.theStart.push_back(1);
testProps.theWordLoc.theEnd.push_back(15);
vector < vector <wordProps> > theWordProps;
theWordProps.resize(Tsize);
theWordProps[0].push_back(testProps);
cout << "index[0] = " << theWordProps[0].front().theFile << endl;
cout << "index[0] = " << theWordProps[0].front().theCount << endl;
cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theLoc << endl;
cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theStart << endl;
cout << "index[0] = " << theWordProps[0].front().theWordLoc[0].theEnd << endl;
cout << "size of theWordProps[0] = " << theWordProps[0].size();
cout << endl;
}