簡體   English   中英

計算字符向量中單詞的出現

[英]Counting occurrences of word in vector of characters

我已經編寫了一個程序來將文本文件存儲在字符向量中。

#include<iostream>
#include<fstream>
#include <algorithm>
#include<vector>
using namespace std;

int main()
{
    vector<char> vec;
    ifstream file("text.txt");

    if(!file.eof() && !file.fail())
    {
        file.seekg(0, std::ios_base::end);
        std::streampos fileSize = file.tellg();
        vec.resize(fileSize);

        file.seekg(0, std::ios_base::beg);
        file.read(&vec[0], fileSize);
    }

    int c = count(vec.begin(), vec.end(), 'U');
    cout << c;
    return 0;
}

我想計算文本文件中“ USER”的出現,但是使用count我只能計算字符數。 如何計算字符向量中“ USER”的出現次數?

例如text.txt

USERABRUSER#$$* 34 USER ABC RR IERUSER

那么“ USER”的計數為4。單詞只能為大寫。

std::string有一個find成員函數,它將在另一個字符串中查找一個字符串的出現。 您可以使用它來計算出現次數,例如:

size_t count(std::string const &haystack, std::string const &needle) {
    auto occurrences = 0;
    auto len = needle.size();
    auto pos = 0;

    while (std::string::npos != (pos = haystack.find(needle, pos))) {
        ++occurrences;
        pos += len;
    }
    return occurrences;
}

例如:

int main() {
    std::string input{ "USERABRUSER#$$* 34 USER ABC RR IERUSER" };

    std::cout << count(input, "USER");
}

...產生4的輸出。

這就是我要做的:

#include <fstream>
#include <sstream>
#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

int main() {
   unordered_map<string, size_t> data;
   string line;
   ifstream file("text.txt");
   while (getline(file, line)) {
      istringstream is(line);
      string word;
      while (is >> word) {
        ++data[word];
      }
   }

   cout << data["USER"] << endl;
   return 0;
}

讓我們再試一次。 再一次,不需要向量。 我認為這是最C ++慣用的方式。 它使用std::stringfind()方法按順序重復查找子字符串,直到到達字符串的末尾。

#include <fstream>
#include <iostream>
#include <string>

int main() {
    // Read entire file into a single string.
    std::ifstream file_stream("text.txt");
    std::string file_contents(std::istreambuf_iterator<char>(file_stream),
        std::istreambuf_iterator<char>());

    unsigned count = 0;
    std::string substr = "USER";
    for (size_t i = file_contents.find(substr); i != std::string::npos;
        i = str.find(substr, i + substr.length())) {
        ++count;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM