01/10/2018, 14:35

C++ Map, Tìm từ xuất hiện nhiều nhất trong File

e mới học C++ . Các anh c giúp e về cách sử dụng std:: map< string, int> để tìm ra từ xuất hiện nhiều nhất trong file text (cần xóa bỏ dấu câu và chuyển thành kí tự thường). e cảm ơn nhiều ạ!

viết 16:45 ngày 01/10/2018

C++ đời mới cho nó đẹp

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <cctype>
#include <algorithm>

int main()
{
    if (std::ifstream fin("..."); fin)
    {
        std::map<std::string, int> wordCount;
        for (std::string token, word; fin >> token; word.clear())
        {
            std::copy_if(begin(token), end(token), std::back_inserter(word),
                         [](char c) { return !ispunct(c); });
            std::transform(begin(word), end(word), begin(word), tolower);
            wordCount[word]++;
        }
        std::cout << std::max_element(begin(wordCount), end(wordCount),
                                      [](auto const& lhs, auto const& rhs){
                                          return lhs.second < rhs.second;
                                      })->first << "\n";
    }
    else
    {
        std::cerr << "Cannot open file\n";
        return 1;
    }
}
Nguyen yen viết 16:45 ngày 01/10/2018

http://codepad.org/durMtRcZ
m tự viết code đây ạ, cơ mà có hai chỗ chưa đc b xem giúp m với

viết 16:38 ngày 01/10/2018

viết 1 hàm bỏ dấu câu và chuyển thành chữ thường
std::string toLowerCaseWord(const std::string& token)

còn tìm từ xuất hiện nhiều nhất thì bạn loop qua cái map luôn:

bình thường loop qua mảng bằng
for (int i = 0; i < n; ++i)
thì loop các phần tử trong map bằng cách
for (std::map<std::string, int>::iterator it = map.begin(); it != map.end(); ++it)
nếu thấy dài quá thì xài
for (auto it = map.begin(); it != map.end(); ++it)
it có thể xem là “con trỏ” tới 1 cặp (key, value). Key trong map<string,int> là string, value là int. Lấy key thông qua gọi it->first, lấy value thông qua it->second. Rồi từ đây tìm max dễ rồi

Nguyen yen viết 16:47 ngày 01/10/2018

M có viết hàm để chuyển thành kí tự thường và bỏ dấu câu rồi. Nhưng m đang mắc ở chỗ là m dùng std::transform m máy nó báo lỗi k debug đc . M mới học mà bài thầy bắt làm theo hướng vậy

Nguyen yen viết 16:41 ngày 01/10/2018

std::string prepare(const std::string& s)
{

std::string result;
std::transform(s.begin(), s.end(), result.begin(), :: tolower);
for (int i = 0; i < s.length(); i++) {
	if (ispunct(s.at(i)))
		result.pop_back();
}
return result;

}

Nguyen yen viết 16:46 ngày 01/10/2018

đây là hàm chuyển kí tự của m

viết 16:39 ngày 01/10/2018

std::transform(s.begin(), s.end(), std::back_inserter(result), tolower);

vậy mới đúng. Do result là chuỗi rỗng nên result.begin() ko xài được, phải xài std::back_inserter(result)

cái dòng transform đó có thể viết lại là:

for (int i = 0; i < s.length(); ++i)
    result += tolower(s[i]);

mới hoc mà đòi viết std::transform làm gì ~.~

cái loại bỏ dấu câu cũng ko đúng nữa, coi lại cách sử dụng string với vòng lặp đi

Nguyen yen viết 16:38 ngày 01/10/2018

dạ, ông thầy để hàm vậy ạ, m đọc trên mạng rồi đó ạ . cảm ơn a( bạn ) nhé

Nguyen yen viết 16:51 ngày 01/10/2018

m đã chạy thử chương trình và thành công cảm ơn bạn lần nữa nhé

Bài liên quan
0