2015-02-05 138 views
1

我想创建一个简单的倒排索引。我在每个文档中都有一个带有docIds和关键字的文件。所以第一步是尝试读取文件并标记文本文件。我在网上发现了一个标记化函数,它应该可以工作并稍微改变它。我想在空白处标记每个单词。我的文本文件没有任何逗号或句点。标记文本文件后,令牌存储在向量中。所以在运行tokenize函数后,我尝试打印出矢量的元素,但没有发生任何事情。然后我试着打印出矢量的大小,结果我得到0。这里是我的代码:为什么我的矢量是空的?

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include "functions.h" 
#include "vector" 

using namespace std; 

int main() 
{ 
    string line; 
    vector<string> v; 
    ifstream myfile("test.txt"); 


    if(myfile.is_open()){ 
     while(getline(myfile,line)){ 
      //cout << line << '\n'; 
      tokenize(line, ' ', v); 
     } 

     myfile.close(); 
    } 
    else cout << "Unable to open file"; 

    cout << v.size() << '\n'; 

    return 0; 
} 

,这里是我的记号化功能:

using namespace std; 

void tokenize(string s, char c, vector<string> v) { 
    string::size_type i = 0; 
    string::size_type j = s.find(c); 

    while (j != string::npos) { 
     v.push_back(s.substr(i, j-i)); 
     i = ++j; 
     j = s.find(c, j); 

     if (j == string::npos) 
     v.push_back(s.substr(i, s.length())); 
    } 
} 

我不能使用strtok,因为我会在以后的程序中使用线程和我在一个论坛上读到strtok对线程无效。

+1

不是应该'无效标记化(字符串s,炭C,矢量&v)'? – vaultah 2015-02-05 18:22:51

+1

你通过价值传递你的向量。 – drescherjm 2015-02-05 18:22:51

+0

如果要查看调用函数中的结果,则需要通过引用传递向量。顺便说一句:使''#include '而不是'#include“vector”'。 – 2015-02-05 18:22:57

回答

4

为什么我的向量为空?

因为您的值传递vector

void tokenize(string s, char c, vector<string> v) { 

更改它的引用:

void tokenize(string s, char c, vector<string>& v) { 
+0

哦,感谢它的作品,第一行doesn不会得到标记,第一行只是一个数字,即文档的数量。我在网上找到的函数也有'string&s'而不是'string s'我说,有没有区别? – captain 2015-02-05 18:35:32

+0

是的。使用'string s'生成输入字符串的副本。使用'string&s',使用对原始字符串的引用。如果您不介意通过'tokenize'修改原始字符串,那么使用引用会更有效。 – 2015-02-05 18:39:10