为什么我的向量是空的?

时间:2015-02-05 18:21:41

标签: c++ c++11 tokenize

我想创建一个简单的倒排索引。我有一个文件,其中包含每个文档中的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;
}

这是我的tokenize函数:

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 个答案:

答案 0 :(得分:4)

  

为什么我的矢量是空的?

因为您按值传递vector

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

将其更改为参考:

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