можно построить вектор векторов структур с векторами структур? (Да, действительно) - PullRequest
3 голосов
/ 04 декабря 2010

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

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

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

Вот ошибки cmpilation. Все три ошибки относятся к вектору структур внутри структуры:

'class std :: vector>' не имеет члена с именем 'theLoc'
'class std :: vector>' не имеет члена с именем 'theStart'
В классе std :: vector> нет члена с именем theEnd

Если я настрою код, как предлагает 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;
}

Ответы [ 4 ]

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

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

1 голос
/ 04 декабря 2010

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

1 голос
/ 04 декабря 2010

Я не знаю о выборе дизайна структуры данных, кроме как сделать ее 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;
}
0 голосов
/ 04 декабря 2010

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

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

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