я могу построить вектор векторов структур с векторами структур? (Да, действительно)

Я пытаюсь построить относительно сложную структуру данных (для меня). Моя цель — читать слова из текстовых документов и индексировать слова и некоторые специфические свойства в хэш-таблицу. Таблица строится из вектора векторов структур: (вектор ‹ вектор > vecName;). С этим мне повезло. Каждое уникальное слово хэшируется в позицию индекса в векторе. Второе измерение вектора (вектор структур) хранит информацию о читаемом файле и о том, где в файле находится слово. Для каждого файла, который я читаю, если я нахожу определенное слово несколько раз, счетчик увеличивается в структуре, а вектор структур с целыми числами сохраняет информацию для всех местоположений, в которых слово хранится в файле.

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

  1. Мне любопытно, есть ли у кого-нибудь предложения по лучшей реализации структуры данных, чем мое предложение. Будет ли класс, который содержит несколько независимых элементов данных вместо этого бегемота, более удобным для использования?
  2. Похоже, у меня либо синтаксическая ошибка, вызывающая ошибку компиляции, либо я просто пытаюсь создать структуру, которую векторный класс не поддерживает.

Вот ошибки компиляции. Все три ошибки относятся к вектору структур внутри структуры:

'class std::vector >' не имеет элемента с именем 'theLoc'
'класс std::vector >' не имеет элемента с именем 'theStart'
'класс std::vector >' не имеет элемента под названием "Конец"

Если я изменю код, как предлагает EboMike, исходные ошибки исчезнут, но я тогда получу:

Я получаю другую ошибку, которую я не могу опубликовать, потому что редактор думает, что я публикую гиперссылки. Резюме: * 'Запрос члена 'push_back' в 'testProps.wordProps::theWordLoc:theLoc, который имеет неклассовый тип 'int'*

Вот мой код и ссылка на диаграмму (из моего блога) того, как я вижу структуру данных:

http://iamkevinfrye.com/blog/wp-content/uploads/2010/10/MicroSearch-Hash-Table-Data-Structure-Diagram.png

#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;
}

person fryeguy    schedule 04.12.2010    source источник
comment
Похоже, у меня либо синтаксическая ошибка, вызывающая ошибку компиляции... Пожалуйста, опубликуйте полный текст сообщения об ошибке.   -  person Laurence Gonsalves    schedule 04.12.2010


Ответы (4)


Я не знаю о выборе дизайна структуры данных, кроме создания hasmap, но ваш код почти правильный!

Посмотрите мои комментарии:

int main()
{    
    int Tsize = 20000;

    wordProps testProps;
    testProps.theFile = "test1";
    testProps.theCount = 1;

    // create your wordLoc object
    wordLoc wl;
    wl.theLoc = 200;
    wl.theStart = 1;
    wl.theEnd = 15;

    // put it into the vector
    testProps.theWordLoc.push_back(wl);

    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;
}
person Victor Parmar    schedule 04.12.2010
comment
Спасибо Вик! Это имеет смысл, и я использовал тот же тип логики при передаче testProps в WordProps, но там было немного туманно, и я не смог увидеть тот же шаблон для передачи wl в wordProps. Спасибо за помощь в этой маленькой победе! :) теперь я могу немного отдохнуть! - person fryeguy; 04.12.2010

Сначала ошибка компиляции: вы, вероятно, имеете в виду эту строку:

testProps.theWordLoc.theLoc.push_back(200);
testProps.theWordLoc.theStart.push_back(1);
testProps.theWordLoc.theEnd.push_back(15);

theWordLoc — это вектор, поэтому вам нужно обращаться с ним как с таковым, например:

testProps.theWordLoc[0].theLoc = 200;

или, если там еще ничего нет:

wordLoc wordLocData;
worldLocData.theLoc = 200;
worldLocData.theStart = 1;
worldLocData.theEnd = 15;
testProps.theWorldLoc.push_back(worldLocData);

Что касается вашего фактического вопроса: это жизнеспособное решение? Да, это. Однако какой объем данных вы ожидаете получить? И насколько стойкий? Если ответ «тонны, длинные», я бы вместо этого выбрал базу данных. Имейте таблицу для worldLoc, одну для wordProps, одну для векторов более высокого уровня, и все станет намного быстрее и чище.

Кроме того, мне не нравятся векторы верхнего уровня. Я не понимаю структуру, которую вы собираетесь там сделать (я только что взглянул на диаграмму), но похоже, что вместо этого вы ищете хэш-карту.

person EboMike    schedule 04.12.2010
comment
Я отредактировал исходный пост с ошибками. Они находятся в строках, предложенных EboMike. theWordLoc — это вектор, и я пытаюсь использовать метод .push_back, который не требует индекса. Однако я попытался добавить индекс и получил другой набор ошибок. - person fryeguy; 04.12.2010
comment
Спасибо за комментарий по использованию базы данных. Очень заманчиво. К сожалению для меня, это часть исследовательского проекта по структурам данных, и, по сути, я использую базу данных, я просто создаю ее с нуля... но суть все еще ясна. Я не мог не согласиться. - person fryeguy; 04.12.2010
comment
Вы должны действительно рассмотреть это. Похоже, это действительно то, что вы должны использовать. Кстати, отредактирует ответ об ошибке компиляции - theLoc не является вектором, поэтому вы не можете сказать о нем push_back. - person EboMike; 04.12.2010

В testProps.theWordLoc.theLoc вы имеете в виду theLoc элемент вектора theWordLoc. Это просто неприемлемо. Вы должны использовать что-то вроде testProps.theWordLoc[0].theLoc.

person Ryan Li    schedule 04.12.2010
comment
Итак, вы предполагаете, что в этом контексте метод .push_back векторного класса неприемлем, и я должен предоставить индекс для доступа к члену WordLoc? - person fryeguy; 04.12.2010
comment
@fryeguy: если вы хотите push_back, используйте это: testProps.theWordLoc.push_back({instance of wordLoc}). theWordLoc — это вектор. - person Ryan Li; 04.12.2010
comment
@fryeguy у тебя неправильная логика. Ваш код говорит testProps.theWordLoc.theLoc.push_back. Это означает, что перейдите в testProps, затем найдите элемент theWordLoc этого, затем найдите элемент theLoc элемента that, затем найдите элемент push_back элемента that . Этот код пытается найти theLoc в theWordLoc, но theWordLoc является std::vector — у него нет theLoc. У чего есть theLoc, так это то, что вы хотите push_back на него наложить. Вы хотите push_back перейти на theWordLoc, поэтому ваш код должен выглядеть как theWordLoc.push_back( что-то здесь ). - person Karl Knechtel; 04.12.2010

Может быть, для структуры данных мультикарта может быть вашим другом здесь, заменяя вектор верхнего уровня векторов.

http://www.cplusplus.com/reference/stl/multimap/

person mPopp    schedule 04.12.2010
comment
могу ли я использовать хэш-функцию для хранения значений в мультикарте? Я ищу создание таблицы, максимально соответствующей классу Big-O of 1. - person fryeguy; 04.12.2010
comment
Из ссылки, которую я разместил, вы можете видеть, что при использовании шаблона для мультикарты вы можете указать Comparer в качестве параметра, который может содержать вашу хеш-функцию, если я что-то не совсем упустил. Вставка должна быть чем-то вроде O (log (n)) и поиск с хешем O (1). - person mPopp; 04.12.2010