Counting occurrences of word in vector of characters

僤鯓⒐⒋嵵緔 提交于 2019-12-13 01:26:09

问题


I have written a program to store a text file 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;
}

I want to count occurrence of "USER" in the text file , but using count i can only count number of characters . How can i count number of occurrences of "USER" in the vector of character?

For example text.txt

USERABRUSER#$$* 34 USER ABC RR IERUSER

Then the count of "USER" is 4. Words can only be in uppercase.


回答1:


std::string has a find member function that will find an occurrence of one string inside another. You can use that to count occurrences something like this:

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;
}

For example:

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

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

...produces an output of 4.




回答2:


This is how I would do it:

#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;
}



回答3:


Let's try again. Once again, a vector isn't necessary. This is what I would consider to be the most C++ idiomatic way. It uses std::string's find() method to repeatedly find the substring in order until the end of the string is reached.

#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;
    }
}


来源:https://stackoverflow.com/questions/29991079/counting-occurrences-of-word-in-vector-of-characters

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!