我正在用C ++创建一个Indexer应用程序。 目录的文本文件中的每个唯一单词,我想存储像 - first_map<“word”,second_map<“文件对象引用”,列表{行号}>
要第一次填写此地图,我将在目录中逐字解析每个文件。要将数据推送到地图中,我在使用like -
时遇到编译错误pool[token][it].push_back(count);
我认为如果内部地图值的类型为int,则不会抛出错误。 我也尝试使用like-
pool[token].insert(std::make_pair(it, count);
这也因错误而失败。 将数据插入此容器的正确方法是什么?
完整来源如下 -
#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];
}
};
答案 0 :(得分:0)
好消息:
使编译器在相关的行上消失:
pool[token][&*it].push_back(count);
it
是std::vector<File>::iterator
,pool
是
std::map<std::string, std::map<File*, std::list<int> > >
因此,要从迭代器中获得普通的File *
,“&amp; *”是典型的方法。
坏消息:
这不起作用。只要std::vector<File>
重新分配,其内容的所有本机指针和迭代器都将失效。你的std::map
将留下永不落地的指针。
如果这个结构所属的物体被复制或移动,那么一切都会从高轨道中被摧毁。
您需要完全重新考虑数据和容器的整体设计。