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 ạ!
C++ Map, Tìm từ xuất hiện nhiều nhất trong File
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;
}
}
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
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
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;
}
đây là hàm chuyển kí tự của m
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
dạ, ông thầy để hàm vậy ạ, m đọc trên mạng rồi đó ạ . cảm ơn a( bạn ) nhé
m đã chạy thử chương trình và thành công cảm ơn bạn lần nữa nhé