Ich erstelle eine Indexer-Anwendung in C++. Jedes einzelne Wort in den Textdateien eines Verzeichnisses, mag ich wie- first_map < „Wort“ speichern, second_map < „File Objektverweis“, List {Zeilennummern}>Was ist ein richtiger Weg, um in eine Karte der Liste der Liste einfügen
diese Karte erstes Mal füllen, Ich analysiere jede Datei Wort für Wort im Verzeichnis. Um die Daten in der Karte zu drücken, ich einen Kompilierungsfehler bekommen, während Sie wie-
pool[token][it].push_back(count);
Ich denke, das nicht einen Fehler werfen würde, wenn innere Karte Wert vom Typ int ist. Ich versuche auch, wie-
pool[token].insert(std::make_pair(it, count);
Dies ist auch fehlgeschlagen mit einem Fehler zu verwenden. Was ist der richtige Weg, um Daten in diesen Container einzufügen?
komplette Quelle unten-
gegeben#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include<iostream>
#include<iterator>
#include<algorithm>
#include<string>
#include<sstream>
#include<list>
#include<vector>
#include<fstream>
#include<map>
#include<ctime>
class File {
public:
std::string file_name;
int timestamp;
File(std::string name) : file_name(name) {
struct stat st;
int ierr = stat (file_name.c_str(), &st);
if (ierr != 0) {
std::cout << "error in getting timestamp";
}
timestamp = st.st_mtime;
}
};
class Location {
public:
std::vector<File> indexer;
virtual std::map<File*, std::list<int> > find_pattern(std::string& word);
Location(const char* in_dir){
DIR* FD;
struct dirent* in_file;
/* Scanning the in directory */
if (NULL == (FD = opendir (in_dir)))
{
fprintf(stderr, "Error : Failed to open input directory - %s\n", strerror(errno));
throw -1;
}
while ((in_file = readdir(FD)))
{
if (!strcmp (in_file->d_name, "."))
continue;
if (!strcmp (in_file->d_name, ".."))
continue;
indexer.push_back(File(in_file->d_name));
}
}
};
class TextFileLocation : public Location {
public:
std::map<std::string, std::map<File*, std::list<int> > > pool;
TextFileLocation(const char* in_dir) : Location(in_dir){
for(auto it = indexer.begin(); it != indexer.end(); it++){
std::ifstream file1(it->file_name);
if(!file1)
{
std::cout<<"Error opening output file"<<std::endl;
continue;
}
std::string line;
std::string token;
int count = 0;
while (std::getline(file1, line))
{
count++;
std::map<File*, std::list<int> > *file_line =
std::istringstream ss(line);
while(std::getline(ss, token, ' ')) {
if(token.empty())
continue;
pool[token][it].push_back(count);
}
}
}
}
std::map<File*, std::list<int> > find_pattern(std::string& word){
return pool[word];
}
};
Danke, ich werde auf Container Design neu betrachten. Jeder Vorschlag Ihrer Seite, einen effizienten Container mit weniger Datenredundanz zu erstellen. – user1868132
Ich musste vor kurzem eine Hash-Tabelle mit einem Vektor von Listen von Paaren erstellen. Es hat ganz gut geklappt. Würde dir das helfen? –