G++;链接器错误:未定义对的引用 我试图编译一个C++程序,但是编译器正在返回这个错误: operadoraarquivos.o: In function `split(std::string, int&)': operadoraarquivos.cpp:(.text+0x0): multiple definition of `split(std::string, int&)' main.o:main.cpp:(.text+0x0): first defined here Hash.o: In function `HashTable::HashTable(int)': Hash.cpp:(.text+0x65): undefined reference to `Lista<Palavra>::Lista()' Hash.cpp:(.text+0xba): undefined reference to `Lista<Palavra>::~Lista()' Hash.o: In function `HashTable::~HashTable()': Hash.cpp:(.text+0x134): undefined reference to `Lista<Palavra>::~Lista()' Hash.o: In function `HashTable::inserir(std::string, int)': Hash.cpp:(.text+0x2d0): undefined reference to `Lista<Palavra>::vazia()' Hash.cpp:(.text+0x31b): undefined reference to `Lista<Palavra>::buscar(Palavra)' Hash.cpp:(.text+0x34d): undefined reference to `Lista<int>::Lista()' Hash.cpp:(.text+0x365): undefined reference to `Lista<int>::inserir(int)' Hash.cpp:(.text+0x3a5): undefined reference to `Lista<Palavra>::inserir(Palavra)' Hash.cpp:(.text+0x3ce): undefined reference to `Lista<int>::inserir(int)' Hash.cpp:(.text+0x3e7): undefined reference to `Lista<int>::Lista()' Hash.cpp:(.text+0x3ff): undefined reference to `Lista<int>::inserir(int)' Hash.cpp:(.text+0x43f): undefined reference to `Lista<Palavra>::inserir(Palavra)' Hash.o: In function `HashTable::buscar(std::string)': Hash.cpp:(.text+0x590): undefined reference to `Lista<Palavra>::buscar(Palavra)' Hash.o: In function `HashTable::imprimir(std::string)': Hash.cpp:(.text+0x6d5): undefined reference to `Lista<int>::imprimir()' collect2: error: ld returned 1 exit status*****

G++;链接器错误:未定义对的引用 我试图编译一个C++程序,但是编译器正在返回这个错误: operadoraarquivos.o: In function `split(std::string, int&)': operadoraarquivos.cpp:(.text+0x0): multiple definition of `split(std::string, int&)' main.o:main.cpp:(.text+0x0): first defined here Hash.o: In function `HashTable::HashTable(int)': Hash.cpp:(.text+0x65): undefined reference to `Lista<Palavra>::Lista()' Hash.cpp:(.text+0xba): undefined reference to `Lista<Palavra>::~Lista()' Hash.o: In function `HashTable::~HashTable()': Hash.cpp:(.text+0x134): undefined reference to `Lista<Palavra>::~Lista()' Hash.o: In function `HashTable::inserir(std::string, int)': Hash.cpp:(.text+0x2d0): undefined reference to `Lista<Palavra>::vazia()' Hash.cpp:(.text+0x31b): undefined reference to `Lista<Palavra>::buscar(Palavra)' Hash.cpp:(.text+0x34d): undefined reference to `Lista<int>::Lista()' Hash.cpp:(.text+0x365): undefined reference to `Lista<int>::inserir(int)' Hash.cpp:(.text+0x3a5): undefined reference to `Lista<Palavra>::inserir(Palavra)' Hash.cpp:(.text+0x3ce): undefined reference to `Lista<int>::inserir(int)' Hash.cpp:(.text+0x3e7): undefined reference to `Lista<int>::Lista()' Hash.cpp:(.text+0x3ff): undefined reference to `Lista<int>::inserir(int)' Hash.cpp:(.text+0x43f): undefined reference to `Lista<Palavra>::inserir(Palavra)' Hash.o: In function `HashTable::buscar(std::string)': Hash.cpp:(.text+0x590): undefined reference to `Lista<Palavra>::buscar(Palavra)' Hash.o: In function `HashTable::imprimir(std::string)': Hash.cpp:(.text+0x6d5): undefined reference to `Lista<int>::imprimir()' collect2: error: ld returned 1 exit status*****,c++,linker,g++,C++,Linker,G++,operadoraarquivos.cpp #include "operadoraarquivos.hpp" int main(int argc, char* argv[]) { OperadoraArquivos opArq(argv[1], argv[2], argv[3]); opArq.imprimirBusca(); opArq.~OperadoraArquivos(); } #include "operadoraarquivos.hpp" Operado

operadoraarquivos.cpp

#include "operadoraarquivos.hpp"

int main(int argc, char* argv[]) {
    OperadoraArquivos opArq(argv[1], argv[2], argv[3]);
    opArq.imprimirBusca();
    opArq.~OperadoraArquivos();
}
#include "operadoraarquivos.hpp"

OperadoraArquivos::OperadoraArquivos(string livro, string sw, string buscas) {
    this->livro.open(livro.c_str(), ios_base::in);
    this->sw.open(sw.c_str(), ios_base::in);
    this->buscas.open(buscas.c_str(), ios_base::in);
    this->resultados.open(ARQ_RESULTADOS, ios_base::out);
    this->ht = new HashTable(8388593); // 8388593 < 2^23

    stopwords = new string[335];

   // while (!sw.eof())
   //      getline(sw, stopwords[i++]);
    int i = 0;
   while (getline(this->sw, stopwords[i++]));
    string linha;
    for ( i = 1; !this->livro.eof(); i++) {
        getline(this->livro, linha);
        int n;
        string *palavras = split(linha, n);
        for (int j = 0; j < n; j++) {
            if (deveGuardar(palavras[j]))
                ht->inserir(palavras[j], i);
        }
    }
}

OperadoraArquivos::~OperadoraArquivos() {
    this->livro.close();
    this->buscas.close();
    this->resultados.close();
    this->sw.close();
}

bool OperadoraArquivos::deveGuardar(string str) {
    int baixo = 0, alto = 334, meio;
    while (baixo <= alto) {
        meio = (baixo + alto) / 2;
        if (str == stopwords[meio])
            return true;
        else {
            if (str > stopwords[meio])
                baixo = meio;
            else
                alto = meio;
        }
    }
    return false;
}

string OperadoraArquivos::paraMaiuscula(string str) {
    string result = "";
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        result += toupper(*it);
    return result;
}

void OperadoraArquivos::imprimirBusca() {
    string temp;
    while (getline(buscas, temp)) {
        ht->imprimir(temp);
    }
}
#ifndef OPERADORAARQUIVOS_H
#define OPERADORAARQUIVOS_H

#include <iostream>
#include <fstream>
#include <cctype>
#include "Hash.hpp"

#define ARQ_RESULTADOS "resultados.txt"

string* split(string str, int &n) {
    int contador = 0;
    for ( string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            contador++;
    }
    string *tokens = new string[contador+1]();
    int i = 0;
    for (string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            i++;
        tokens[i] += *it;
    }
    n = i + 1;
    return tokens;
}

class OperadoraArquivos
{
private:
    string* stopwords;
    ifstream livro;
    ifstream sw;
    ifstream buscas;
    ofstream resultados;
    bool deveGuardar (string str);
    string paraMaiuscula (string str);
    HashTable* ht;
public:
    OperadoraArquivos(string livro, string sw, string buscas);

    ~OperadoraArquivos();

    HashTable* getHashTable();

    void imprimirBusca();

};

#endif // OPERADORAARQUIVOS_H
#include "Hash.hpp"
#include "Lista.hpp"

HashTable::HashTable(int max) {
    vetorListas = new Lista<Palavra>[max]();
    this->max = max;
}

HashTable::~HashTable() {
    delete[] vetorListas;
}

int HashTable::hash (string str) {
    Posicao indice = 0;
    int expoente = 0;
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        indice += (*it) * pow(128,expoente++);
    indice %= max;
}

void HashTable::inserir(string texto, int linha) {
    Palavra palavra;
    Posicao indice = hash(texto);
    palavra.chave = indice;
    palavra.texto = texto;

    if (!vetorListas[indice].vazia())
    {
        No<Palavra>* no = vetorListas[indice].buscar(palavra);

        if (!no) {
            palavra.lista = new Lista<int>();
            palavra.lista->inserir(linha);
            vetorListas[palavra.chave].inserir(palavra);
        }
        else {
            no->item.lista->inserir(linha);
        }

    }
    else {
        palavra.lista = new Lista<int>();
        palavra.lista->inserir(linha);
        vetorListas[indice].inserir(palavra);
    }
}

No<Palavra>* HashTable::buscar (string texto) {
    Palavra palavra;
    palavra.texto = texto;
    palavra.chave = hash(texto);
    return vetorListas[palavra.chave].buscar(palavra);
}

No<Palavra>* HashTable::operator[] (string texto) {
    return buscar(texto);
}

void HashTable::imprimir(string texto) {
    No<Palavra>* no = this->buscar(texto);
    cout << texto << " ";
    no->item.lista->imprimir();
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#include "Lista.hpp"
template <class T>
Lista<T>::Lista() {
    flVazia();
}
template <class T>
Lista<T>::~Lista() {
    while (!vazia())
        retira(ult);
}
template <class T>
void Lista<T>::flVazia() {
    prim = new No<T>();
    //prim->item = {0,0};
    ult = prim;
    ult->proximo = NULL;
}
template <class T>
bool Lista<T>::vazia(){
    return prim == ult;
}
template <class T>
void Lista<T>::inserir(T x) {
    ult->prox = new No<T>();
    ult = ult->prox;
    ult->item = x;
    ult->proximo = NULL;
}
template <class T>
void Lista<T>::retira(No<T> *p) {
    if (vazia() || p == NULL || p->prox == NULL) {
        cout << "Erro: Retirada impossivel" << endl;
    }
    else {
        No<T> *q = p->prox;
        p->prox = q->prox;
        if (p->prox == NULL) ult = p;
        delete(q);
    }
}
/*No<T>* Lista<T>::buscar(Posicao pos) {
    int i=0;
    for (No *p = prim; p!=NULL; p=p->prox) {
        if (pos == i)
            return p;
        ++i;
    }
    return NULL;
}*/
template <class T>
No<T>* Lista<T>::buscar(T item) {
    for (No<T> *p = prim; p!=NULL; p=p->prox) {
            if (p->item == item)
                return p;
        }
        return NULL;
}
/*template <class T>
No<T>* Lista<T>::operator[](Posicao pos)
{
    return buscar(pos);
}*/
template <class T>
void Lista<T>::imprimir() {
    for (No<T>* p = prim; p!=NULL; p=p->prox) {
        cout << p->item;
        if (p->prox!=NULL)
            cout << " ";
    }
    cout << endl;
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#包括“operadorarquivos.hpp”
OperadoaraRquivos::OperadoaraRquivos(字符串livro、字符串sw、字符串buscas){
this->livro.open(livro.c_str(),ios_base::in);
这->sw.open(sw.c_str(),ios_base::in);
这->buscas.open(buscas.c_str(),ios_base::in);
这->resultados.open(ARQ\u resultados,ios\u base::out);
this->ht=newhashtable(8388593);//8388593<2^23
stopwords=新字符串[335];
//而(!sw.eof())
//getline(sw,stopwords[i++]);
int i=0;
而(getline(this->sw,stopwords[i++]);
弦琳哈;
对于(i=1;!this->livro.eof();i++){
getline(此->利夫罗,林哈);
int n;
string*palavras=split(linha,n);
对于(int j=0;jinserir(palavras[j],i);
}
}
}
OperadoraArquivos::~OperadoraArquivos(){
此->livro.close();
这->buscas.close();
此->resultados.close();
此->sw.close();
}
bool operadorarquivos::deveGuardar(字符串str){
int-baixo=0,alto=334,meio;
while(baixo stopwords[meio])
baixo=meio;
其他的
alto=meio;
}
}
返回false;
}
字符串operatorarquivos::paraMaiuscula(字符串str){
字符串结果=”;
对于(std::string::iterator it=str.begin();it!=str.end();++it)
结果+=toupper(*it);
返回结果;
}
无效操作权::不正当行为{
字符串温度;
while(getline(总线、温度)){
ht->IMPIMIR(温度);
}
}
operadoraarquivos.hpp

#include "operadoraarquivos.hpp"

int main(int argc, char* argv[]) {
    OperadoraArquivos opArq(argv[1], argv[2], argv[3]);
    opArq.imprimirBusca();
    opArq.~OperadoraArquivos();
}
#include "operadoraarquivos.hpp"

OperadoraArquivos::OperadoraArquivos(string livro, string sw, string buscas) {
    this->livro.open(livro.c_str(), ios_base::in);
    this->sw.open(sw.c_str(), ios_base::in);
    this->buscas.open(buscas.c_str(), ios_base::in);
    this->resultados.open(ARQ_RESULTADOS, ios_base::out);
    this->ht = new HashTable(8388593); // 8388593 < 2^23

    stopwords = new string[335];

   // while (!sw.eof())
   //      getline(sw, stopwords[i++]);
    int i = 0;
   while (getline(this->sw, stopwords[i++]));
    string linha;
    for ( i = 1; !this->livro.eof(); i++) {
        getline(this->livro, linha);
        int n;
        string *palavras = split(linha, n);
        for (int j = 0; j < n; j++) {
            if (deveGuardar(palavras[j]))
                ht->inserir(palavras[j], i);
        }
    }
}

OperadoraArquivos::~OperadoraArquivos() {
    this->livro.close();
    this->buscas.close();
    this->resultados.close();
    this->sw.close();
}

bool OperadoraArquivos::deveGuardar(string str) {
    int baixo = 0, alto = 334, meio;
    while (baixo <= alto) {
        meio = (baixo + alto) / 2;
        if (str == stopwords[meio])
            return true;
        else {
            if (str > stopwords[meio])
                baixo = meio;
            else
                alto = meio;
        }
    }
    return false;
}

string OperadoraArquivos::paraMaiuscula(string str) {
    string result = "";
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        result += toupper(*it);
    return result;
}

void OperadoraArquivos::imprimirBusca() {
    string temp;
    while (getline(buscas, temp)) {
        ht->imprimir(temp);
    }
}
#ifndef OPERADORAARQUIVOS_H
#define OPERADORAARQUIVOS_H

#include <iostream>
#include <fstream>
#include <cctype>
#include "Hash.hpp"

#define ARQ_RESULTADOS "resultados.txt"

string* split(string str, int &n) {
    int contador = 0;
    for ( string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            contador++;
    }
    string *tokens = new string[contador+1]();
    int i = 0;
    for (string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            i++;
        tokens[i] += *it;
    }
    n = i + 1;
    return tokens;
}

class OperadoraArquivos
{
private:
    string* stopwords;
    ifstream livro;
    ifstream sw;
    ifstream buscas;
    ofstream resultados;
    bool deveGuardar (string str);
    string paraMaiuscula (string str);
    HashTable* ht;
public:
    OperadoraArquivos(string livro, string sw, string buscas);

    ~OperadoraArquivos();

    HashTable* getHashTable();

    void imprimirBusca();

};

#endif // OPERADORAARQUIVOS_H
#include "Hash.hpp"
#include "Lista.hpp"

HashTable::HashTable(int max) {
    vetorListas = new Lista<Palavra>[max]();
    this->max = max;
}

HashTable::~HashTable() {
    delete[] vetorListas;
}

int HashTable::hash (string str) {
    Posicao indice = 0;
    int expoente = 0;
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        indice += (*it) * pow(128,expoente++);
    indice %= max;
}

void HashTable::inserir(string texto, int linha) {
    Palavra palavra;
    Posicao indice = hash(texto);
    palavra.chave = indice;
    palavra.texto = texto;

    if (!vetorListas[indice].vazia())
    {
        No<Palavra>* no = vetorListas[indice].buscar(palavra);

        if (!no) {
            palavra.lista = new Lista<int>();
            palavra.lista->inserir(linha);
            vetorListas[palavra.chave].inserir(palavra);
        }
        else {
            no->item.lista->inserir(linha);
        }

    }
    else {
        palavra.lista = new Lista<int>();
        palavra.lista->inserir(linha);
        vetorListas[indice].inserir(palavra);
    }
}

No<Palavra>* HashTable::buscar (string texto) {
    Palavra palavra;
    palavra.texto = texto;
    palavra.chave = hash(texto);
    return vetorListas[palavra.chave].buscar(palavra);
}

No<Palavra>* HashTable::operator[] (string texto) {
    return buscar(texto);
}

void HashTable::imprimir(string texto) {
    No<Palavra>* no = this->buscar(texto);
    cout << texto << " ";
    no->item.lista->imprimir();
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#include "Lista.hpp"
template <class T>
Lista<T>::Lista() {
    flVazia();
}
template <class T>
Lista<T>::~Lista() {
    while (!vazia())
        retira(ult);
}
template <class T>
void Lista<T>::flVazia() {
    prim = new No<T>();
    //prim->item = {0,0};
    ult = prim;
    ult->proximo = NULL;
}
template <class T>
bool Lista<T>::vazia(){
    return prim == ult;
}
template <class T>
void Lista<T>::inserir(T x) {
    ult->prox = new No<T>();
    ult = ult->prox;
    ult->item = x;
    ult->proximo = NULL;
}
template <class T>
void Lista<T>::retira(No<T> *p) {
    if (vazia() || p == NULL || p->prox == NULL) {
        cout << "Erro: Retirada impossivel" << endl;
    }
    else {
        No<T> *q = p->prox;
        p->prox = q->prox;
        if (p->prox == NULL) ult = p;
        delete(q);
    }
}
/*No<T>* Lista<T>::buscar(Posicao pos) {
    int i=0;
    for (No *p = prim; p!=NULL; p=p->prox) {
        if (pos == i)
            return p;
        ++i;
    }
    return NULL;
}*/
template <class T>
No<T>* Lista<T>::buscar(T item) {
    for (No<T> *p = prim; p!=NULL; p=p->prox) {
            if (p->item == item)
                return p;
        }
        return NULL;
}
/*template <class T>
No<T>* Lista<T>::operator[](Posicao pos)
{
    return buscar(pos);
}*/
template <class T>
void Lista<T>::imprimir() {
    for (No<T>* p = prim; p!=NULL; p=p->prox) {
        cout << p->item;
        if (p->prox!=NULL)
            cout << " ";
    }
    cout << endl;
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
\ifndef operadorarquivos\u H
#定义OPERADORAARQUIVOS_H
#包括
#包括
#包括
#包括“Hash.hpp”
#定义ARQ_RESULTADOS“RESULTADOS.txt”
字符串*拆分(字符串str,int&n){
int contador=0;
for(string::iterator it=str.begin();it!=str.end();++it){
如果(*it=='')
contador++;
}
string*tokens=新字符串[contador+1]();
int i=0;
for(string::iterator it=str.begin();it!=str.end();++it){
如果(*it=='')
i++;
代币[i]+=*it;
}
n=i+1;
归还代币;
}
歌剧班
{
私人:
字符串*停止字;
ifstream livro;
ifstream sw;
ifstream-buscas;
流的结果;
bool-deveGuardar(字符串str);
串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串串;
哈希表*ht;
公众:
OperadoraArquivos(弦乐、弦乐、弦乐);
~operadorarquivos();
HashTable*getHashTable();
无效的不正当行为USCA();
};
#完//OPERADORAARQUIVOS_H
Hash.cpp

#include "operadoraarquivos.hpp"

int main(int argc, char* argv[]) {
    OperadoraArquivos opArq(argv[1], argv[2], argv[3]);
    opArq.imprimirBusca();
    opArq.~OperadoraArquivos();
}
#include "operadoraarquivos.hpp"

OperadoraArquivos::OperadoraArquivos(string livro, string sw, string buscas) {
    this->livro.open(livro.c_str(), ios_base::in);
    this->sw.open(sw.c_str(), ios_base::in);
    this->buscas.open(buscas.c_str(), ios_base::in);
    this->resultados.open(ARQ_RESULTADOS, ios_base::out);
    this->ht = new HashTable(8388593); // 8388593 < 2^23

    stopwords = new string[335];

   // while (!sw.eof())
   //      getline(sw, stopwords[i++]);
    int i = 0;
   while (getline(this->sw, stopwords[i++]));
    string linha;
    for ( i = 1; !this->livro.eof(); i++) {
        getline(this->livro, linha);
        int n;
        string *palavras = split(linha, n);
        for (int j = 0; j < n; j++) {
            if (deveGuardar(palavras[j]))
                ht->inserir(palavras[j], i);
        }
    }
}

OperadoraArquivos::~OperadoraArquivos() {
    this->livro.close();
    this->buscas.close();
    this->resultados.close();
    this->sw.close();
}

bool OperadoraArquivos::deveGuardar(string str) {
    int baixo = 0, alto = 334, meio;
    while (baixo <= alto) {
        meio = (baixo + alto) / 2;
        if (str == stopwords[meio])
            return true;
        else {
            if (str > stopwords[meio])
                baixo = meio;
            else
                alto = meio;
        }
    }
    return false;
}

string OperadoraArquivos::paraMaiuscula(string str) {
    string result = "";
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        result += toupper(*it);
    return result;
}

void OperadoraArquivos::imprimirBusca() {
    string temp;
    while (getline(buscas, temp)) {
        ht->imprimir(temp);
    }
}
#ifndef OPERADORAARQUIVOS_H
#define OPERADORAARQUIVOS_H

#include <iostream>
#include <fstream>
#include <cctype>
#include "Hash.hpp"

#define ARQ_RESULTADOS "resultados.txt"

string* split(string str, int &n) {
    int contador = 0;
    for ( string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            contador++;
    }
    string *tokens = new string[contador+1]();
    int i = 0;
    for (string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            i++;
        tokens[i] += *it;
    }
    n = i + 1;
    return tokens;
}

class OperadoraArquivos
{
private:
    string* stopwords;
    ifstream livro;
    ifstream sw;
    ifstream buscas;
    ofstream resultados;
    bool deveGuardar (string str);
    string paraMaiuscula (string str);
    HashTable* ht;
public:
    OperadoraArquivos(string livro, string sw, string buscas);

    ~OperadoraArquivos();

    HashTable* getHashTable();

    void imprimirBusca();

};

#endif // OPERADORAARQUIVOS_H
#include "Hash.hpp"
#include "Lista.hpp"

HashTable::HashTable(int max) {
    vetorListas = new Lista<Palavra>[max]();
    this->max = max;
}

HashTable::~HashTable() {
    delete[] vetorListas;
}

int HashTable::hash (string str) {
    Posicao indice = 0;
    int expoente = 0;
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        indice += (*it) * pow(128,expoente++);
    indice %= max;
}

void HashTable::inserir(string texto, int linha) {
    Palavra palavra;
    Posicao indice = hash(texto);
    palavra.chave = indice;
    palavra.texto = texto;

    if (!vetorListas[indice].vazia())
    {
        No<Palavra>* no = vetorListas[indice].buscar(palavra);

        if (!no) {
            palavra.lista = new Lista<int>();
            palavra.lista->inserir(linha);
            vetorListas[palavra.chave].inserir(palavra);
        }
        else {
            no->item.lista->inserir(linha);
        }

    }
    else {
        palavra.lista = new Lista<int>();
        palavra.lista->inserir(linha);
        vetorListas[indice].inserir(palavra);
    }
}

No<Palavra>* HashTable::buscar (string texto) {
    Palavra palavra;
    palavra.texto = texto;
    palavra.chave = hash(texto);
    return vetorListas[palavra.chave].buscar(palavra);
}

No<Palavra>* HashTable::operator[] (string texto) {
    return buscar(texto);
}

void HashTable::imprimir(string texto) {
    No<Palavra>* no = this->buscar(texto);
    cout << texto << " ";
    no->item.lista->imprimir();
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#include "Lista.hpp"
template <class T>
Lista<T>::Lista() {
    flVazia();
}
template <class T>
Lista<T>::~Lista() {
    while (!vazia())
        retira(ult);
}
template <class T>
void Lista<T>::flVazia() {
    prim = new No<T>();
    //prim->item = {0,0};
    ult = prim;
    ult->proximo = NULL;
}
template <class T>
bool Lista<T>::vazia(){
    return prim == ult;
}
template <class T>
void Lista<T>::inserir(T x) {
    ult->prox = new No<T>();
    ult = ult->prox;
    ult->item = x;
    ult->proximo = NULL;
}
template <class T>
void Lista<T>::retira(No<T> *p) {
    if (vazia() || p == NULL || p->prox == NULL) {
        cout << "Erro: Retirada impossivel" << endl;
    }
    else {
        No<T> *q = p->prox;
        p->prox = q->prox;
        if (p->prox == NULL) ult = p;
        delete(q);
    }
}
/*No<T>* Lista<T>::buscar(Posicao pos) {
    int i=0;
    for (No *p = prim; p!=NULL; p=p->prox) {
        if (pos == i)
            return p;
        ++i;
    }
    return NULL;
}*/
template <class T>
No<T>* Lista<T>::buscar(T item) {
    for (No<T> *p = prim; p!=NULL; p=p->prox) {
            if (p->item == item)
                return p;
        }
        return NULL;
}
/*template <class T>
No<T>* Lista<T>::operator[](Posicao pos)
{
    return buscar(pos);
}*/
template <class T>
void Lista<T>::imprimir() {
    for (No<T>* p = prim; p!=NULL; p=p->prox) {
        cout << p->item;
        if (p->prox!=NULL)
            cout << " ";
    }
    cout << endl;
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#包括“Hash.hpp”
#包括“Lista.hpp”
哈希表::哈希表(int max){
vetorListas=新列表a[max]();
这->最大值=最大值;
}
哈希表::~HashTable(){
删除[]否决权;
}
int哈希表::哈希(字符串str){
Posicao指数=0;
整数指数=0;
对于(std::string::iterator it=str.begin();it!=str.end();++it)
指数+=(*it)*功率(128,指数++);
指标%=最大值;
}
void哈希表::inserir(字符串texto,int linha){
帕拉夫拉帕拉夫拉;
Posicao indice=散列(texto);
palavra.chave=印度;
palavra.texto=texto;
如果(!vetorListas[indice].vazia())
{
No*No=vetorListas[indice].buscar(palavra);
如果(!否){
palavra.lista=新lista();
帕拉夫拉.利斯塔->因塞里尔(林哈);
维托利斯塔斯[palavra.chave].inserir(palavra);
}
否则{
no->item.lista->inserir(linha);
}
}
否则{
palavra.lista=新lista();
帕拉夫拉.利斯塔->因塞里尔(林哈);
维托利斯塔斯[印度]。因塞里尔(帕拉夫拉);
}
}
否*哈希表::buscar(字符串texto){
帕拉夫拉帕拉夫拉;
palavra.texto=texto;
palavra.chave=散列(texto);
返回维托利斯塔斯[palavra.chave].buscar(palavra);
}
否*哈希表::运算符[](字符串texto){
返回客车(texto);
}
void哈希表::imprimir(字符串texto){
否*否=此->客车(texto);
不能改进();
}
Hash.hpp

#include "operadoraarquivos.hpp"

int main(int argc, char* argv[]) {
    OperadoraArquivos opArq(argv[1], argv[2], argv[3]);
    opArq.imprimirBusca();
    opArq.~OperadoraArquivos();
}
#include "operadoraarquivos.hpp"

OperadoraArquivos::OperadoraArquivos(string livro, string sw, string buscas) {
    this->livro.open(livro.c_str(), ios_base::in);
    this->sw.open(sw.c_str(), ios_base::in);
    this->buscas.open(buscas.c_str(), ios_base::in);
    this->resultados.open(ARQ_RESULTADOS, ios_base::out);
    this->ht = new HashTable(8388593); // 8388593 < 2^23

    stopwords = new string[335];

   // while (!sw.eof())
   //      getline(sw, stopwords[i++]);
    int i = 0;
   while (getline(this->sw, stopwords[i++]));
    string linha;
    for ( i = 1; !this->livro.eof(); i++) {
        getline(this->livro, linha);
        int n;
        string *palavras = split(linha, n);
        for (int j = 0; j < n; j++) {
            if (deveGuardar(palavras[j]))
                ht->inserir(palavras[j], i);
        }
    }
}

OperadoraArquivos::~OperadoraArquivos() {
    this->livro.close();
    this->buscas.close();
    this->resultados.close();
    this->sw.close();
}

bool OperadoraArquivos::deveGuardar(string str) {
    int baixo = 0, alto = 334, meio;
    while (baixo <= alto) {
        meio = (baixo + alto) / 2;
        if (str == stopwords[meio])
            return true;
        else {
            if (str > stopwords[meio])
                baixo = meio;
            else
                alto = meio;
        }
    }
    return false;
}

string OperadoraArquivos::paraMaiuscula(string str) {
    string result = "";
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        result += toupper(*it);
    return result;
}

void OperadoraArquivos::imprimirBusca() {
    string temp;
    while (getline(buscas, temp)) {
        ht->imprimir(temp);
    }
}
#ifndef OPERADORAARQUIVOS_H
#define OPERADORAARQUIVOS_H

#include <iostream>
#include <fstream>
#include <cctype>
#include "Hash.hpp"

#define ARQ_RESULTADOS "resultados.txt"

string* split(string str, int &n) {
    int contador = 0;
    for ( string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            contador++;
    }
    string *tokens = new string[contador+1]();
    int i = 0;
    for (string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            i++;
        tokens[i] += *it;
    }
    n = i + 1;
    return tokens;
}

class OperadoraArquivos
{
private:
    string* stopwords;
    ifstream livro;
    ifstream sw;
    ifstream buscas;
    ofstream resultados;
    bool deveGuardar (string str);
    string paraMaiuscula (string str);
    HashTable* ht;
public:
    OperadoraArquivos(string livro, string sw, string buscas);

    ~OperadoraArquivos();

    HashTable* getHashTable();

    void imprimirBusca();

};

#endif // OPERADORAARQUIVOS_H
#include "Hash.hpp"
#include "Lista.hpp"

HashTable::HashTable(int max) {
    vetorListas = new Lista<Palavra>[max]();
    this->max = max;
}

HashTable::~HashTable() {
    delete[] vetorListas;
}

int HashTable::hash (string str) {
    Posicao indice = 0;
    int expoente = 0;
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        indice += (*it) * pow(128,expoente++);
    indice %= max;
}

void HashTable::inserir(string texto, int linha) {
    Palavra palavra;
    Posicao indice = hash(texto);
    palavra.chave = indice;
    palavra.texto = texto;

    if (!vetorListas[indice].vazia())
    {
        No<Palavra>* no = vetorListas[indice].buscar(palavra);

        if (!no) {
            palavra.lista = new Lista<int>();
            palavra.lista->inserir(linha);
            vetorListas[palavra.chave].inserir(palavra);
        }
        else {
            no->item.lista->inserir(linha);
        }

    }
    else {
        palavra.lista = new Lista<int>();
        palavra.lista->inserir(linha);
        vetorListas[indice].inserir(palavra);
    }
}

No<Palavra>* HashTable::buscar (string texto) {
    Palavra palavra;
    palavra.texto = texto;
    palavra.chave = hash(texto);
    return vetorListas[palavra.chave].buscar(palavra);
}

No<Palavra>* HashTable::operator[] (string texto) {
    return buscar(texto);
}

void HashTable::imprimir(string texto) {
    No<Palavra>* no = this->buscar(texto);
    cout << texto << " ";
    no->item.lista->imprimir();
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#include "Lista.hpp"
template <class T>
Lista<T>::Lista() {
    flVazia();
}
template <class T>
Lista<T>::~Lista() {
    while (!vazia())
        retira(ult);
}
template <class T>
void Lista<T>::flVazia() {
    prim = new No<T>();
    //prim->item = {0,0};
    ult = prim;
    ult->proximo = NULL;
}
template <class T>
bool Lista<T>::vazia(){
    return prim == ult;
}
template <class T>
void Lista<T>::inserir(T x) {
    ult->prox = new No<T>();
    ult = ult->prox;
    ult->item = x;
    ult->proximo = NULL;
}
template <class T>
void Lista<T>::retira(No<T> *p) {
    if (vazia() || p == NULL || p->prox == NULL) {
        cout << "Erro: Retirada impossivel" << endl;
    }
    else {
        No<T> *q = p->prox;
        p->prox = q->prox;
        if (p->prox == NULL) ult = p;
        delete(q);
    }
}
/*No<T>* Lista<T>::buscar(Posicao pos) {
    int i=0;
    for (No *p = prim; p!=NULL; p=p->prox) {
        if (pos == i)
            return p;
        ++i;
    }
    return NULL;
}*/
template <class T>
No<T>* Lista<T>::buscar(T item) {
    for (No<T> *p = prim; p!=NULL; p=p->prox) {
            if (p->item == item)
                return p;
        }
        return NULL;
}
/*template <class T>
No<T>* Lista<T>::operator[](Posicao pos)
{
    return buscar(pos);
}*/
template <class T>
void Lista<T>::imprimir() {
    for (No<T>* p = prim; p!=NULL; p=p->prox) {
        cout << p->item;
        if (p->prox!=NULL)
            cout << " ";
    }
    cout << endl;
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
\ifndef LISTA\u H
#定义列表a_H
#包括
使用名称空间std;
typedef int chave;
国际民航组织;
模板
类别号{
公众:
T项;
否*proximo;
};
模板
Lista类{
私人:
没有*prim,*ult;
void flVazia();
公众:
Lista();
~Lista();
bool-vazia();
空隙插入(T x);
无效视网膜(无*p);
//无*客车(Posicao pos);
编号*客车(T项);
无效无效();
//无效的临时合同(项目);
};
#恩迪夫
Lista.cpp

#include "operadoraarquivos.hpp"

int main(int argc, char* argv[]) {
    OperadoraArquivos opArq(argv[1], argv[2], argv[3]);
    opArq.imprimirBusca();
    opArq.~OperadoraArquivos();
}
#include "operadoraarquivos.hpp"

OperadoraArquivos::OperadoraArquivos(string livro, string sw, string buscas) {
    this->livro.open(livro.c_str(), ios_base::in);
    this->sw.open(sw.c_str(), ios_base::in);
    this->buscas.open(buscas.c_str(), ios_base::in);
    this->resultados.open(ARQ_RESULTADOS, ios_base::out);
    this->ht = new HashTable(8388593); // 8388593 < 2^23

    stopwords = new string[335];

   // while (!sw.eof())
   //      getline(sw, stopwords[i++]);
    int i = 0;
   while (getline(this->sw, stopwords[i++]));
    string linha;
    for ( i = 1; !this->livro.eof(); i++) {
        getline(this->livro, linha);
        int n;
        string *palavras = split(linha, n);
        for (int j = 0; j < n; j++) {
            if (deveGuardar(palavras[j]))
                ht->inserir(palavras[j], i);
        }
    }
}

OperadoraArquivos::~OperadoraArquivos() {
    this->livro.close();
    this->buscas.close();
    this->resultados.close();
    this->sw.close();
}

bool OperadoraArquivos::deveGuardar(string str) {
    int baixo = 0, alto = 334, meio;
    while (baixo <= alto) {
        meio = (baixo + alto) / 2;
        if (str == stopwords[meio])
            return true;
        else {
            if (str > stopwords[meio])
                baixo = meio;
            else
                alto = meio;
        }
    }
    return false;
}

string OperadoraArquivos::paraMaiuscula(string str) {
    string result = "";
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        result += toupper(*it);
    return result;
}

void OperadoraArquivos::imprimirBusca() {
    string temp;
    while (getline(buscas, temp)) {
        ht->imprimir(temp);
    }
}
#ifndef OPERADORAARQUIVOS_H
#define OPERADORAARQUIVOS_H

#include <iostream>
#include <fstream>
#include <cctype>
#include "Hash.hpp"

#define ARQ_RESULTADOS "resultados.txt"

string* split(string str, int &n) {
    int contador = 0;
    for ( string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            contador++;
    }
    string *tokens = new string[contador+1]();
    int i = 0;
    for (string::iterator it=str.begin(); it!=str.end(); ++it) {
        if (*it == ' ')
            i++;
        tokens[i] += *it;
    }
    n = i + 1;
    return tokens;
}

class OperadoraArquivos
{
private:
    string* stopwords;
    ifstream livro;
    ifstream sw;
    ifstream buscas;
    ofstream resultados;
    bool deveGuardar (string str);
    string paraMaiuscula (string str);
    HashTable* ht;
public:
    OperadoraArquivos(string livro, string sw, string buscas);

    ~OperadoraArquivos();

    HashTable* getHashTable();

    void imprimirBusca();

};

#endif // OPERADORAARQUIVOS_H
#include "Hash.hpp"
#include "Lista.hpp"

HashTable::HashTable(int max) {
    vetorListas = new Lista<Palavra>[max]();
    this->max = max;
}

HashTable::~HashTable() {
    delete[] vetorListas;
}

int HashTable::hash (string str) {
    Posicao indice = 0;
    int expoente = 0;
    for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
        indice += (*it) * pow(128,expoente++);
    indice %= max;
}

void HashTable::inserir(string texto, int linha) {
    Palavra palavra;
    Posicao indice = hash(texto);
    palavra.chave = indice;
    palavra.texto = texto;

    if (!vetorListas[indice].vazia())
    {
        No<Palavra>* no = vetorListas[indice].buscar(palavra);

        if (!no) {
            palavra.lista = new Lista<int>();
            palavra.lista->inserir(linha);
            vetorListas[palavra.chave].inserir(palavra);
        }
        else {
            no->item.lista->inserir(linha);
        }

    }
    else {
        palavra.lista = new Lista<int>();
        palavra.lista->inserir(linha);
        vetorListas[indice].inserir(palavra);
    }
}

No<Palavra>* HashTable::buscar (string texto) {
    Palavra palavra;
    palavra.texto = texto;
    palavra.chave = hash(texto);
    return vetorListas[palavra.chave].buscar(palavra);
}

No<Palavra>* HashTable::operator[] (string texto) {
    return buscar(texto);
}

void HashTable::imprimir(string texto) {
    No<Palavra>* no = this->buscar(texto);
    cout << texto << " ";
    no->item.lista->imprimir();
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#include "Lista.hpp"
template <class T>
Lista<T>::Lista() {
    flVazia();
}
template <class T>
Lista<T>::~Lista() {
    while (!vazia())
        retira(ult);
}
template <class T>
void Lista<T>::flVazia() {
    prim = new No<T>();
    //prim->item = {0,0};
    ult = prim;
    ult->proximo = NULL;
}
template <class T>
bool Lista<T>::vazia(){
    return prim == ult;
}
template <class T>
void Lista<T>::inserir(T x) {
    ult->prox = new No<T>();
    ult = ult->prox;
    ult->item = x;
    ult->proximo = NULL;
}
template <class T>
void Lista<T>::retira(No<T> *p) {
    if (vazia() || p == NULL || p->prox == NULL) {
        cout << "Erro: Retirada impossivel" << endl;
    }
    else {
        No<T> *q = p->prox;
        p->prox = q->prox;
        if (p->prox == NULL) ult = p;
        delete(q);
    }
}
/*No<T>* Lista<T>::buscar(Posicao pos) {
    int i=0;
    for (No *p = prim; p!=NULL; p=p->prox) {
        if (pos == i)
            return p;
        ++i;
    }
    return NULL;
}*/
template <class T>
No<T>* Lista<T>::buscar(T item) {
    for (No<T> *p = prim; p!=NULL; p=p->prox) {
            if (p->item == item)
                return p;
        }
        return NULL;
}
/*template <class T>
No<T>* Lista<T>::operator[](Posicao pos)
{
    return buscar(pos);
}*/
template <class T>
void Lista<T>::imprimir() {
    for (No<T>* p = prim; p!=NULL; p=p->prox) {
        cout << p->item;
        if (p->prox!=NULL)
            cout << " ";
    }
    cout << endl;
}
#ifndef LISTA_H
#define LISTA_H

#include <iostream>

using namespace std;
typedef int chave;
typedef int Posicao;

template <class T>

class No {
public:
 T item;
 No<T> *proximo;
};

template <class T>
class Lista {
private:
    No<T> *prim, *ult;
    void flVazia();
public:
    Lista();
    ~Lista();
    bool vazia();
    void inserir(T x);
    void retira(No<T> *p);
    //No<T>* buscar(Posicao pos);
    No<T>* buscar(T item);
    void imprimir();
    //void imprimeChave(Item item);
};

#endif
#包括“Lista.hpp”
模板
Lista::Lista(){
flVazia();
}
模板
Lista::~Lista(){
而(!vazia())
视网膜(ult);
}
模板
void Lista::flVazia(){
prim=新的No();
//prim->item={0,0};
ult=prim;
ult->proximo=NULL;
}
模板
布尔·利斯塔::瓦齐亚(){
返回prim==ult;
}
模板
void Lista::inserir(T x){
ult->prox=新编号();
ult=ult->prox;
ult->item=x;
ult->proximo=NULL;
}
模板
void Lista::retira(无*p){
如果(vazia()| | p==NULL | | p->prox==NULL){
cout-prox=q->prox;
如果(p->prox==NULL)ult=p;
删除(q);
}
}
/*编号*列表A::客车(Posicao pos){
int i=0;
对于(无*p=prim;p!=NULL;p=p->prox){
如果(pos==i)
返回p;
++一,;
}
返回NULL;
}*/
模板
编号*列表A::客车(T项){
对于(无*p=prim;p!=NULL;p=p->prox){
如果(p->item==item)
返回p;
}
返回NULL;
}
/*模板
No*Lista::operator[](Posicao pos)
{
返回客车(pos);
}*/
模板
void Lista::imprimir(){
对于(无*p=prim;p!=NULL;p=p->prox){
cout项;
如果(p->prox!=NULL)
可能有两个问题: