ตัวนับความถี่ของคำ
นับจำนวนครั้งที่แต่ละคำปรากฏในไฟล์ข้อความโดยใช้ std::map
ตัวนับความถี่ของคำ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
เป้าหมายของโครงงาน
อ่านไฟล์ข้อความแล้วพิมพ์คำที่ไม่ซ้ำกันแต่ละคำพร้อมจำนวนครั้งที่ปรากฏ เป็นปัญหาคลาสสิกที่แก้ได้อย่างเป็นระเบียบด้วย std::map หรือ std::unordered_map
ส่วนหัวที่ต้องใช้
การรับส่งข้อมูลไฟล์ สตริง และคอนเทนเนอร์แบบเชื่อมโยง
#include <fstream>
#include <map>
#include <string>
#include <iostream>การอ่านคำทีละคำ
ตัวดำเนินการดึงข้อมูล >> จะอ่านโทเค็นที่คั่นด้วยช่องว่าง ซึ่งเหมาะอย่างยิ่งสำหรับคำดิบ
std::ifstream file("book.txt");
std::map<std::string, int> counts;
std::string word;
while (file >> word) {
counts[word]++;
}การปรับรูปแบบคำให้เป็นมาตรฐาน
เปลี่ยนคำแต่ละคำให้เป็นตัวพิมพ์เล็ก เพื่อให้ “Hello” และ “hello” ถูกนับเป็นคำเดียวกัน
#include <algorithm>
std::transform(word.begin(), word.end(), word.begin(),
[](unsigned char c) { return std::tolower(c); });การตัดเครื่องหมายวรรคตอน
ลบเครื่องหมายวรรคตอนจากจุดเริ่มต้นและจุดสิ้นสุดของแต่ละคำ
while (!word.empty() && !std::isalpha(word.front())) word.erase(0,1);
while (!word.empty() && !std::isalpha(word.back())) word.pop_back();การพิมพ์จำนวนครั้ง
วนดูข้อมูลใน map แล้วพิมพ์แต่ละคู่ข้อมูล std::map จะวนข้อมูลตามลำดับคีย์ที่เรียงไว้
for (const auto& [w, n] : counts) {
std::cout << w << ": " << n << "\n";
}เรียงตามความถี่
หากต้องการพิมพ์ตามความถี่แทนการเรียงตามตัวอักษร ให้คัดลอกรายการลงในเวกเตอร์แล้วเรียงลำดับ
std::vector<std::pair<std::string, int>> entries(counts.begin(), counts.end());
std::sort(entries.begin(), entries.end(),
[](auto& a, auto& b) { return a.second > b.second; });N อันดับแรกที่พบบ่อยที่สุด
พิมพ์เฉพาะรายการ 10 อันดับแรก หรือจำนวน N ใด ๆ จากเวกเตอร์ที่เรียงลำดับแล้ว
for (size_t i = 0; i < 10 && i < entries.size(); ++i) {
std::cout << entries[i].first << ": " << entries[i].second << "\n";
}map เทียบกับ unordered_map
สำหรับไฟล์ขนาดใหญ่ std::unordered_map โดยเฉลี่ยจะเร็วกว่า (ค้นหาในเวลา O(1)) แต่จะวนข้อมูลในลำดับที่ไม่แน่นอน ใช้ std::map เมื่อต้องการผลลัพธ์ที่เรียงลำดับ
คำหยุด
กรองคำสั้นที่พบบ่อย เช่น “the”, “and” และ “of” ออกโดยใช้เซตของคำหยุด
static const std::set<std::string> stop = {"the","and","of","to","a"};
if (stop.count(word)) continue;การนับบรรทัดหรืออักขระ
รูปแบบอื่นของแนวคิดเดียวกัน: นับจำนวนบรรทัดทั้งหมดด้วย std::getline และนับอักขระทั้งหมดด้วย std::ifstream + std::istreambuf_iterator
ข้อควรพิจารณาด้านประสิทธิภาพ
สำหรับไฟล์ขนาดมหาศาล ให้ใช้ unordered_map กับคีย์ string_view แมปไฟล์ไว้ในหน่วยความจำ และหลีกเลี่ยงการจองหน่วยความจำบนฮีปสำหรับแต่ละคำ
ตรวจสอบความเข้าใจ
คอนเทนเนอร์ใดจะวนข้อมูลตามลำดับตัวอักษรโดยอัตโนมัติ
สรุปทบทวน
ตัวนับความถี่ของคำผสานการใช้สตรีม สตริง คอนเทนเนอร์แบบเชื่อมโยง และอัลกอริทึมเข้าด้วยกัน เลือกใช้ map สำหรับผลลัพธ์ที่เรียงลำดับ หรือ unordered_map สำหรับความเร็ว ปรับรูปแบบคำให้เป็นมาตรฐาน ตัดเครื่องหมายวรรคตอน และพิจารณาคำหยุดเพื่อให้ได้ผลลัพธ์ที่สะอาดขึ้น
คำถามที่พบบ่อย
บทเรียน “ตัวนับความถี่ของคำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวนับความถี่ของคำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวนับความถี่ของคำ”
นับจำนวนครั้งที่แต่ละคำปรากฏในไฟล์ข้อความโดยใช้ std::map คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวนับความถี่ของคำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สร้างเครื่องคิดเลข CLI อย่างง่าย
- การอ่านและเขียนไฟล์ CSV
- เกมทายตัวเลข
- ตัวนับความถี่ของคำ